36#include <osl/diagnose.h>
38#include <com/sun/star/text/WritingMode2.hpp>
39#include <com/sun/star/script/vba/XVBACompatibility.hpp>
40#include <com/sun/star/sheet/TablePageBreakData.hpp>
41#include <com/sun/star/lang/NotInitializedException.hpp>
43#include <document.hxx>
55#include <stlsheet.hxx>
71#include <progress.hxx>
91#include <undomanager.hxx>
108using ::editeng::SvxBorderLine;
111namespace WritingMode2 = ::com::sun::star::text::WritingMode2;
112using ::com::sun::star::uno::Sequence;
113using ::com::sun::star::sheet::TablePageBreakData;
118std::pair<SCTAB,SCTAB> getMarkedTableRange(
const std::vector<ScTableUniquePtr>& rTables,
const ScMarkData& rMark)
122 SCTAB nMax =
static_cast<SCTAB>(rTables.size());
123 for (
const auto& rTab : rMark)
131 if (rTab < nTabStart)
136 return std::pair<SCTAB,SCTAB>(nTabStart,nTabEnd);
139void collectUIInformation(std::map<OUString, OUString>&& aParameters,
const OUString& rAction)
142 aDescription.
aID =
"grid_window";
143 aDescription.
aAction = rAction;
145 aDescription.
aParent =
"MainWindow";
146 aDescription.
aKeyWord =
"ScGridWinUIObject";
156 explicit ScDefaultAttr(
const ScPatternAttr* pPatAttr) : pAttr(pPatAttr), nFirst(0),
nCount(0) {}
159struct ScLessDefaultAttr
161 bool operator() (
const ScDefaultAttr& rValue1,
const ScDefaultAttr& rValue2)
const
163 return rValue1.pAttr < rValue2.pAttr;
179 if ( _bNeedsNameCheck )
188 maTabs.push_back(
nullptr);
209 rHashCode =
maTabs[nTab]->GetHashCode();
222 rName =
maTabs[nTab]->GetName();
243 maTabs[nTab]->SetCodeName( rName );
247 SAL_WARN(
"sc",
"can't set code name " << rName );
256 rName =
maTabs[nTab]->GetCodeName();
265 static OUString aCacheName, aCacheUpperName;
268 if (aCacheName != rName)
274 const OUString aUpperName = aCacheUpperName;
279 if (aUpperName ==
maTabs[
i]->GetUpperName())
291 std::vector<OUString> aNames;
292 aNames.reserve(
maTabs.size());
303 aNames.push_back(
aName);
312 return maTabs[nTab]->GetAnonymousDBData();
324 maTabs[nTab]->SetAnonymousDBData(std::move(pDBData));
341 sal_Int32 nLen = rName.getLength();
349 for (sal_Int32
i = 0;
i < nLen; ++
i)
364 if (
i == 0 ||
i == nLen - 1)
386 const OUString& rOldName =
a->GetUpperName();
387 bValid = rOldName != aUpperName;
408 OSL_ENSURE(bPrefix,
"Invalid Table Name");
413 rName = aStrTable + OUString::number(
static_cast<sal_Int32
>(
i));
431 aName = rName +
"_" + OUString::number(
static_cast<sal_Int32
>(
i));
447 OUStringBuffer rName;
451 OSL_ENSURE(bPrefix,
"Invalid Table Name");
461 rName.append(
static_cast<sal_Int32
>(
i));
465 bOk = !
GetTable( rName.toString(), nDummy );
468 aNames.push_back(rName.makeStringAndClear());
479 OUString
aName = rName;
492 maTabs[nTab]->SetName(rName);
500 a->SetStreamValid(
false);
505 SCTAB nPos,
const OUString& rName,
bool bExternalDocument,
bool bUndoDeleteTab )
509 if ( !bExternalDocument )
517 if ( bExternalDocument )
518 maTabs[nTabCount]->SetVisible(
false );
545 a->UpdateInsertTab(aCxt);
595 SCTAB nNewSheets =
static_cast<SCTAB>(rNames.size());
597 bool bValid = bNamesValid ||
ValidTab(nTabCount+nNewSheets);
603 for (
SCTAB i = 0;
i < nNewSheets; ++
i )
605 maTabs.emplace_back(
new ScTable(*
this, nTabCount +
i, rNames.at(
i)) );
632 a->UpdateInsertTab(aCxt);
634 for (
SCTAB i = 0;
i < nNewSheets; ++
i)
725 for (
auto & pTab :
maTabs)
727 pTab->UpdateDeleteTab(aCxt);
735 delete pErasedTab.release();
777 if (nTabCount > nSheets)
783 for (
SCTAB aTab = 0; aTab < nSheets; ++aTab)
825 for (
auto & pTab :
maTabs)
827 pTab->UpdateDeleteTab(aCxt);
870 if ( bExternalDocument )
874 for (
i=0; (i< static_cast<SCTAB>(
maTabs.size())) && bValid;
i++)
877 OUString aOldName =
maTabs[
i]->GetName();
886 maTabs[nTab]->SetName(rName);
893 a->SetStreamValid(
false );
905 collectUIInformation({{
"NewName", rName}},
"Rename_Sheet");
921 return maTabs[nTab]->IsVisible();
929 return maTabs[nTab]->IsStreamValid();
937 maTabs[nTab]->SetStreamValid( bSet, bIgnoreLock );
948 return maTabs[nTab]->IsPendingRowHeights();
956 maTabs[nTab]->SetPendingRowHeights( bSet );
970 maTabs[nTab]->SetLoadingRTL( bRTL );
974 maTabs[nTab]->SetLayoutRTL( bRTL );
975 maTabs[nTab]->SetDrawPageSize(
true,
true, eObjectHandling);
982 OSL_ENSURE(pPage,
"Page ?");
990 pObject->SetContextWritingMode( bRTL ? WritingMode2::RL_TB : WritingMode2::LR_TB );
998 return maTabs[nTab]->IsLayoutRTL();
1023 return maTabs[nTab]->GetCellArea( rEndCol, rEndRow );
1034 return maTabs[nTab]->GetTableArea( rEndCol, rEndRow, bCalcHiddens);
1048 maTabs[nTab]->GetFirstDataPos(nCol1, nRow1);
1049 maTabs[nTab]->GetLastDataPos(nCol2, nRow2);
1051 if (nCol1 > nCol2 || nRow1 > nRow2)
1056 if (rStartCol < nCol1)
1058 if (nCol2 < rEndCol)
1060 if (rStartRow < nRow1)
1062 if (nRow2 < rEndRow)
1065 if (rStartCol > rEndCol || rStartRow > rEndRow)
1074 bool bStickyTopRow,
bool bStickyLeftCol,
ScDataAreaExtras* pDataAreaExtras )
const
1081 return maTabs[nTab]->ShrinkToUsedDataArea(
1082 o_bShrunk, rStartCol, rStartRow, rEndCol, rEndRow, bColumnsOnly, bStickyTopRow,
1083 bStickyLeftCol, pDataAreaExtras);
1098 SCCOL& rEndCol,
SCROW& rEndRow,
bool bIncludeOld,
bool bOnlyDown )
const
1101 maTabs[nTab]->GetDataArea( rStartCol, rStartRow, rEndCol, rEndRow, bIncludeOld, bOnlyDown );
1107 if (nTab != rRange.
aEnd.
Tab())
1111 return maTabs[nTab]->GetDataAreaSubrange(rRange);
1121 maTabs[nTab]->LimitChartArea( rStartCol, rStartRow, rEndCol, rEndRow );
1127 if (rRangeList.
is())
1131 ScRange aRange( (*rRangeList)[
i] );
1141 maTabs[nTab]->LimitChartArea(nStartCol, nStartRow, nEndCol, nEndRow);
1147 aNew->push_back(aRange);
1152 OSL_FAIL(
"LimitChartIfAll: Ref==0");
1163 for (
SCTAB nTab=0; nTab< aMaxTab; ++nTab)
1170 rTabRangeEnd = nTab;
1180 for (
SCTAB nTab=rTabRangeEnd+1; nTab< aMaxTab; ++nTab)
1183 rTabRangeStart = nTab;
1186 rTabRangeEnd = nTab;
1204 SCSIZE nSize =
static_cast<SCSIZE>(nEndRow - nStartRow + 1);
1207 for (
SCTAB i=nStartTab; i<=nEndTab && bTest && i < static_cast<SCTAB>(
maTabs.size());
i++)
1209 bTest &=
maTabs[
i]->TestInsertRow( nStartCol, nEndCol, nStartRow, nSize );
1216struct SetDirtyIfPostponedHandler
1221 p->SetDirtyIfPostponed();
1225struct BroadcastRecalcOnRefMoveHandler
1230 p->BroadcastRecalcOnRefMove();
1234struct BroadcastRecalcOnRefMoveGuard
1236 explicit BroadcastRecalcOnRefMoveGuard(
ScDocument* pDoc ) :
1237 aSwitch( *pDoc, false),
1270 for (
i = nStartTab; i <= nEndTab && bTest && i < static_cast<SCTAB>(
maTabs.size());
i++)
1272 bTest &=
maTabs[
i]->TestInsertRow(nStartCol, nEndCol, nStartRow, nSize);
1279 SCTAB nTabRangeStart = nStartTab;
1280 SCTAB nTabRangeEnd = nEndTab;
1282 ScRange aShiftedRange(nStartCol, nStartRow, nTabRangeStart, nEndCol,
MaxRow(), nTabRangeEnd);
1285 std::vector<ScAddress> aGroupPos;
1320 for (
i=nStartTab; i<=nEndTab && i < static_cast<SCTAB>(
maTabs.size());
i++)
1326 for (
i=nStartTab; i<=nEndTab && i < static_cast<SCTAB>(
maTabs.size());
i++)
1329 nStartCol, nStartRow, nStartTab, nEndCol,
MaxRow(), nEndTab,
1330 0,
static_cast<SCROW>(nSize), 0 );
1347 a->SetDirtyIfPostponed();
1351 BroadcastRecalcOnRefMoveGuard g(
this);
1352 std::for_each(
maTabs.begin(),
maTabs.end(), BroadcastRecalcOnRefMoveHandler());
1390 SCTAB nTabRangeStart = nStartTab;
1391 SCTAB nTabRangeEnd = nEndTab;
1398 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1399 ScAddress( nEndCol, nStartRow+nSize-1, nTabRangeEnd ) ) );
1401 ScAddress( nStartCol, nStartRow+nSize, nTabRangeStart ),
1406 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1413 if (
ValidRow(nStartRow+nSize) || bLastRowIncluded )
1418 if (bLastRowIncluded)
1425 aCxt.
maRange =
ScRange( nStartCol, nStartRow+nSize, nTabRangeStart, nEndCol,
MaxRow(), nTabRangeEnd);
1435 *pUndoOutline =
false;
1439 std::vector<ScAddress> aGroupPos;
1441 for (
i = nStartTab; i <= nEndTab && i < static_cast<SCTAB>(
maTabs.size());
i++)
1452 if (
ValidRow(nStartRow+nSize) || bLastRowIncluded )
1462 a->SetDirtyIfPostponed();
1466 BroadcastRecalcOnRefMoveGuard g(
this);
1467 std::for_each(
maTabs.begin(),
maTabs.end(), BroadcastRecalcOnRefMoveHandler());
1493 SCSIZE nSize =
static_cast<SCSIZE>(nEndCol - nStartCol + 1);
1496 for (
SCTAB i=nStartTab; i<=nEndTab && bTest && i < static_cast<SCTAB>(
maTabs.size());
i++)
1498 bTest &=
maTabs[
i]->TestInsertCol( nStartRow, nEndRow, nSize );
1524 for (
i = nStartTab; i <= nEndTab && bTest && i < static_cast<SCTAB>(
maTabs.size());
i++)
1526 bTest &=
maTabs[
i]->TestInsertCol( nStartRow, nEndRow, nSize );
1530 SCTAB nTabRangeStart = nStartTab;
1531 SCTAB nTabRangeEnd = nEndTab;
1536 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1553 for (
i=nStartTab; i<=nEndTab && i < static_cast<SCTAB>(
maTabs.size());
i++)
1571 std::for_each(
maTabs.begin(),
maTabs.end(), SetDirtyIfPostponedHandler());
1576 BroadcastRecalcOnRefMoveGuard g(
this);
1577 std::for_each(
maTabs.begin(),
maTabs.end(), BroadcastRecalcOnRefMoveHandler());
1598 bool* pUndoOutline,
const ScMarkData* pTabMark )
1614 SCTAB nTabRangeStart = nStartTab;
1615 SCTAB nTabRangeEnd = nEndTab;
1619 if (
ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
1622 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1623 ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize-1), nEndRow, nTabRangeEnd ) ) );
1625 ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nTabRangeStart ),
1630 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1637 if (
ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) || bLastColIncluded )
1642 if (bLastColIncluded)
1649 aCxt.
maRange =
ScRange( sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nTabRangeStart,
1650 MaxCol(), nEndRow, nTabRangeEnd);
1660 *pUndoOutline =
false;
1662 for (
i = nStartTab; i <= nEndTab && i < static_cast<SCTAB>(
maTabs.size()); ++
i)
1668 if (
ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) || bLastColIncluded )
1678 a->SetDirtyIfPostponed();
1682 BroadcastRecalcOnRefMoveGuard g(
this);
1683 std::for_each(
maTabs.begin(),
maTabs.end(), BroadcastRecalcOnRefMoveHandler());
1702 ScRange& rColRange,
bool& rInsCol,
bool& rDelCol,
1703 ScRange& rRowRange,
bool& rInsRow,
bool& rDelRow )
1705 OSL_ENSURE( rOld.
aStart == rNew.
aStart,
"FitBlock: Beginning is different" );
1707 rInsCol = rDelCol = rInsRow = rDelRow =
false;
1718 bool bGrowY = ( nNewEndY > nOldEndY );
1719 SCROW nColEndY = bGrowY ? nOldEndY : nNewEndY;
1720 SCCOL nRowEndX = bGrowY ? nNewEndX : nOldEndX;
1724 if ( nNewEndX > nOldEndX )
1726 rColRange =
ScRange( nOldEndX+1, nStartY, nTab, nNewEndX, nColEndY, nTab );
1729 else if ( nNewEndX < nOldEndX )
1731 rColRange =
ScRange( nNewEndX+1, nStartY, nTab, nOldEndX, nColEndY, nTab );
1737 if ( nNewEndY > nOldEndY )
1739 rRowRange =
ScRange( nStartX, nOldEndY+1, nTab, nRowEndX, nNewEndY, nTab );
1742 else if ( nNewEndY < nOldEndY )
1744 rRowRange =
ScRange( nStartX, nNewEndY+1, nTab, nRowEndX, nOldEndY, nTab );
1759 if (
HasAttrib( nStartX, nStartY, nTab, nEndX, nEndY, nTab,
1762 ExtendMerge( nStartX, nStartY, nEndX, nEndY, nTab );
1777 return maTabs[nTab]->ResolveStaticReference(rPos.
Col(), rPos.
Row());
1786 return maTabs[nTab]->ResolveStaticReference(
1821 return maTabs[nTab]->HandleRefArrayForParallelism(rPos.
Col(), rPos.
Row(), rPos.
Row()+
nLength-1, mxGroup);
1830 bool bInsCol,bDelCol,bInsRow,bDelRow;
1839 if ( bInsCol || bDelCol )
1845 if ( bInsRow || bDelRow )
1860 bool bInsCol,bDelCol,bInsRow,bDelRow;
1876 if ( bInsCol || bInsRow )
1896 std::vector<ScAddress> aGroupPos;
1904 ScRange aRange(nCol1, nRow1, 0, nCol2, nRow2, 0);
1905 for (
SCTAB i = 0; i < static_cast<SCTAB>(
maTabs.size());
i++)
1918 for (
SCTAB i = 0; i < static_cast<SCTAB>(
maTabs.size());
i++)
1921 maTabs[
i]->
DeleteArea(nCol1, nRow1, nCol2, nRow2, nDelFlag, bBroadcast, pBroadcastSpans);
1933 if (aGroupPos.empty())
1936 ScRange aRange(nCol1, nRow1, 0, nCol2, nRow2, 0);
1937 for (
SCTAB i = 0; i < static_cast<SCTAB>(
maTabs.size());
i++)
1958 maTabs[nTab]->DeleteArea(nCol1, nRow1, nCol2, nRow2, nDelFlag);
1972 bool bColInfo,
bool bRowInfo )
1985 maTabs[nTab] = std::move(pTable);
1987 maTabs.push_back(std::move(pTable));
1994 maTabs.push_back(
nullptr);
1999 OSL_FAIL(
"InitUndo");
2004 bool bColInfo,
bool bRowInfo )
2008 OSL_FAIL(
"InitUndo");
2021 maTabs.resize(nTab2 + 1);
2022 for (
SCTAB nTab = nTab1; nTab <= nTab2; nTab++)
2024 maTabs[nTab].reset(
new ScTable(*
this, nTab, OUString(), bColInfo, bRowInfo));
2032 OSL_FAIL(
"AddUndoTab");
2041 for (
SCTAB nTab = nTab1; nTab <= nTab2; nTab++)
2044 maTabs[nTab].reset(
new ScTable(*
this, nTab, OUString(), bColInfo, bRowInfo) );
2054 OSL_FAIL(
"SetCutMode without bIsClip");
2064 OSL_FAIL(
"IsCutMode without bIsClip");
2072 const ScMarkData* pMarks,
bool bColRowFlags )
2076 ScRange aThisRange(nCol1, nRow1, nTab1, nCol2, nRow2, nTab2);
2077 CopyToDocument(aThisRange, nFlags, bOnlyMarked, rDestDoc, pMarks, bColRowFlags);
2097 assert( nTab2 <
static_cast<SCTAB>(
maTabs.size()) && nTab2 <
static_cast<SCTAB>(rDestDoc.
maTabs.size()));
2098 for (
SCTAB i = nTab1;
i <= nTab2;
i++)
2101 maTabs[
i]->UndoToTable(aCxt, nCol1, nRow1, nCol2, nRow2, nFlags,
2102 bOnlyMarked, rDestDoc.
maTabs[
i].get());
2131 if (!pTab || !pDestTab)
2136 nFlags, bOnlyMarked, pDestTab, pMarks,
false, bColRowFlags,
2158 for (
SCTAB i = nTab1;
i <= nTab2 &&
i < nMinSizeBothTabs;
i++)
2163 nFlags, bOnlyMarked, rDestDoc.
maTabs[
i].get());
2172 bool bKeepScenarioFlags,
bool bIncludeObjects )
2174 OSL_ENSURE( pMarks,
"CopyToClip: ScMarkData fails" );
2181 SAL_WARN(
"sc",
"CopyToClip: no ClipDoc");
2198 for (
const auto& rxTab :
maTabs)
2202 OUString aTabName = rxTab->GetName();
2219 for (
SCTAB i = 0;
i < nEndTab; ++
i)
2245 ScTable* pDestTab = nDestTab < static_cast<SCTAB>(rDestDoc.
maTabs.size()) ? rDestDoc.
maTabs[nDestTab].get() :
nullptr;
2247 if (!pSrcTab || !pDestTab)
2278 SAL_WARN(
"sc",
"CopyTabToClip: no ClipDoc");
2295 for (
const auto& rxTab :
maTabs)
2299 OUString aTabName = rxTab->GetName();
2318 maTabs[nTab]->CopyToClip(aCxt, nCol1, nRow1, nCol2, nRow2, pClipDoc->
maTabs[nTab].get());
2324 bool bIncludeFiltered)
2327 "TransposeClip with wrong Document" );
2341 sal_uInt16
nIndex = rEntry.second->GetIndex();
2352 SAL_WARN(
"sc",
"TransposeClip: Too big");
2362 const bool bIsMultiRangeRowFilteredTranspose
2369 if (bIsMultiRangeRowFilteredTranspose)
2376 SCROW nRowCount = 0;
2377 for (
size_t j = 0,
n = aClipRanges.
size(); j <
n; ++j)
2379 aClipRange = aClipRanges[j];
2381 SCROW nRowOffset = 0;
2382 if (bIsMultiRangeRowFilteredTranspose)
2385 nRowOffset = nRowCount;
2390 assert(!bIncludeFiltered &&
"bIsMultiRangeRowFilteredTranspose can only be true if bIncludeFiltered is false");
2391 nRowCount += nRowCountNonFiltered;
2394 for (
SCTAB i = 0; i < static_cast<SCTAB>(
maTabs.size());
i++)
2398 OSL_ENSURE(pTransClip->
maTabs[
i],
"TransposeClip: Table not there");
2402 pTransClip->
maTabs[
i].get(), nFlags, bAsLink, bIncludeFiltered);
2427 bIsMultiRangeRowFilteredTranspose);
2439 pClipRangeName->
clear();
2440 for (
const auto& rEntry : *pRangeName)
2442 sal_uInt16
nIndex = rEntry.second->GetIndex();
2443 bool bInUse = (rUsedNames.count(nIndex) > 0);
2448 if (pClipRangeName->
insert(pData))
2449 pData->SetIndex(nIndex);
2462 for (
SCTAB i = 0;
i < nMinSizeBothTabs; ++
i)
2465 maTabs[
i]->FindRangeNamesInUse(
2483 mrDoc.pFormatExchangeList =
nullptr;
2519#if DUMP_COLUMN_STORAGE
2540 return maTabs[nTab].get();
2548 return maTabs[nTab].get();
2555 SAL_WARN(
"sc",
"GetWritableColumnsRange() called for non-existent table");
2558 return maTabs[nTab]->GetWritableColumnsRange(nColBegin, nColEnd);
2565 return maTabs[nTab]->GetAllocatedColumnsRange(nColBegin, nColEnd);
2572 return maTabs[nTab]->GetColumnsRange(nColBegin, nColEnd);
2579 if (pOtherFormatter && pOtherFormatter != pThisFormatter)
2583 if (!pExchangeList->empty())
2632 auto pSet = std::make_shared<sc::ColumnBlockPositionSet>(*
this);
2637 for (
SCTAB nTab : rMark)
2648 for (
const auto& rTab : rMark)
2653 maTabs[rTab]->SetDirtyFromClip(nCol1, nRow1, nCol2, nRow2, rBroadcastSpans);
2663 return maTabs[nTab]->InitColumnBlockPosition(rBlockPos, nCol);
2677 while (!rClipTabs[nClipTab]) nClipTab = (nClipTab+1) %
static_cast<SCTAB>(rClipTabs.size());
2680 rCxt, nCol1, nRow1, nCol2, nRow2, nDx, nDy, rClipTabs[nClipTab].
get());
2688 OSL_ENSURE(
mpDrawLayer,
"CopyBlockFromClip: No drawing layer" );
2694 ScRange aSourceRange(nCol1 - nDx, nRow1 - nDy, nClipTab, nCol2 - nDx, nRow2 - nDy, nClipTab);
2695 ScRange aDestRange(nCol1, nRow1,
i, nCol2, nRow2,
i);
2701 nClipTab = (nClipTab+1) %
static_cast<SCTAB>(rClipTabs.size());
2712 while (!rClipTabs[nClipTab]) nClipTab = (nClipTab+1) %
static_cast<SCTAB>(rClipTabs.size());
2713 SCTAB nDz =
i - nClipTab;
2718 while (
i + nFollow < nTabEnd
2720 && nClipTab + nFollow <
MAXTAB
2721 && rClipTabs[(nClipTab + nFollow + 1) %
static_cast<SCTAB>(rClipTabs.size())] )
2748 auto pColSet = std::make_shared<sc::ColumnSet>( aRefCxt.
maRegroupCols);
2761 nClipTab = (nClipTab+nFollow+1) %
static_cast<SCTAB>(rClipTabs.size());
2762 i = sal::static_int_cast<SCTAB>(
i + nFollow );
2777 while ( nFlagTab <
static_cast<SCTAB>(rClipTabs.size()) && !rClipTabs[nFlagTab] )
2780 SCROW nSourceRow = rClipStartRow;
2781 SCROW nSourceEnd = nClipEndRow;
2782 SCROW nDestRow = nRow1;
2783 SCROW nFilteredRows = 0;
2785 while ( nSourceRow <= nSourceEnd && nDestRow <= nRow2 )
2788 SCROW nSourceRowOriginal = nSourceRow;
2790 nFilteredRows += nSourceRow - nSourceRowOriginal;
2792 if ( nSourceRow <= nSourceEnd )
2795 SCROW nLastRow = nSourceRow;
2797 SCROW nFollow = nLastRow - nSourceRow;
2799 if (nFollow > nSourceEnd - nSourceRow)
2800 nFollow = nSourceEnd - nSourceRow;
2801 if (nFollow > nRow2 - nDestRow)
2802 nFollow = nRow2 - nDestRow;
2804 SCROW nNewDy = nDestRow - nSourceRow;
2806 rCxt, nCol1, nDestRow, nCol2, nDestRow + nFollow, rMark, nDx, nNewDy);
2808 nSourceRow += nFollow + 1;
2809 nDestRow += nFollow + 1;
2812 rClipStartRow = nSourceRow;
2813 return nFilteredRows;
2824 explicit BroadcastAction(
ScDocument& rDoc ) : mrDoc(rDoc), mpCol(nullptr) {}
2826 virtual void startColumn(
ScColumn* pCol )
override
2831 virtual void execute(
SCROW nRow1,
SCROW nRow2,
bool bVal )
override
2838 aRange.aEnd.SetRow(nRow2);
2848 bool bAsLink,
bool bIncludeFiltered,
bool bSkipEmptyCells,
2856 OSL_FAIL(
"CopyFromClip: no ClipDoc");
2875 for (
SCTAB nTab = 0; nTab < static_cast<SCTAB>(pClipDoc->
maTabs.size()); nTab++)
2876 if (pClipDoc->
maTabs[nTab])
2882 nThisEndX, nThisEndY, nTab );
2884 nThisEndX = sal::static_int_cast<SCCOL>( nThisEndX - aClipRange.
aEnd.
Col() );
2885 nThisEndY = sal::static_int_cast<SCROW>( nThisEndY - aClipRange.
aEnd.
Row() );
2886 if ( nThisEndX > nXw )
2888 if ( nThisEndY > nYw )
2894 pClipDoc->
GetClipArea( nDestAddX, nDestAddY, bIncludeFiltered );
2895 nXw = sal::static_int_cast<SCCOL>( nXw + nDestAddX );
2896 nYw = sal::static_int_cast<SCROW>( nYw + nDestAddY );
2916 std::pair<SCTAB,SCTAB> aTabRanges = getMarkedTableRange(
maTabs, rMark);
2917 aCxt.
setTabRange(aTabRanges.first, aTabRanges.second);
2924 pDestRanges = &aLocalRangeList;
2934 for (
size_t nRange = 0; nRange < pDestRanges->
size(); ++nRange )
2936 const ScRange & rRange = (*pDestRanges)[nRange];
2950 SCCOL nC2 = nC1 + nXw;
2953 SCROW nR2 = nR1 + nYw;
2959 std::vector< SCTAB > vTables;
2961 if (bPreallocatePattern)
2965 vTables.push_back(
i );
2975 SCROW nSaveClipStartRow = nClipStartRow;
2978 nClipStartRow = nSaveClipStartRow;
2979 SCCOL nDx = nC1 - nClipStartCol;
2980 SCROW nDy = nR1 - nClipStartRow;
2981 if ( bIncludeFiltered )
2984 aCxt, nC1, nR1, nC2, nR2, rMark, nDx, nDy);
2985 nClipStartRow += nR2 - nR1 + 1;
2993 nC2 = std::min(
static_cast<SCCOL>(nC1 + nXw), nCol2);
2994 }
while (nC1 <= nCol2);
2995 if (nClipStartRow > nClipEndRow)
2996 nClipStartRow = aClipRange.
aStart.
Row();
3003 if (bPreallocatePattern && (nR2+1) <= nRow2)
3005 SCROW nR3 = nR2 + 1;
3006 for (
SCTAB nTab : vTables)
3008 for (
SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
3019 SCSIZE nNeeded = nChunk * (nRow2 - nR3 + 1) / (nYw + 1);
3021 if (nNeeded > nRemain)
3029 bPreallocatePattern =
false;
3033 nR2 = std::min(
static_cast<SCROW>(nR1 + nYw), nRow2);
3034 }
while (nR1 <= nRow2);
3041 for (
SCTAB nTab : rMark)
3053 SetDirtyFromClip(nAllCol1, nAllRow1, nAllCol2, nAllRow2, rMark, nInsFlag, aBroadcastSpans);
3055 BroadcastAction aAction(*
this);
3065 bool bResetCut,
bool bAsLink,
bool bIncludeFiltered,
3066 bool bSkipAttrForEmpty)
3090 if (!bSkipAttrForEmpty)
3100 std::pair<SCTAB,SCTAB> aTabRanges = getMarkedTableRange(
maTabs, rMark);
3101 aCxt.
setTabRange(aTabRanges.first, aTabRanges.second);
3111 SCROW nEndRow = nRow1 + nRowCount - 1;
3112 SCROW nFilteredRows = 0;
3114 if (bIncludeFiltered)
3123 nClipStartRow, nClipEndRow);
3124 nRowCount -= nFilteredRows;
3153 rMark, nInsFlag, aBroadcastSpans);
3155 BroadcastAction aAction(*
this);
3174 OSL_FAIL(
"SetClipArea: No Clip");
3182 OSL_FAIL(
"GetClipArea: No Clip");
3187 if (rClipRanges.
empty())
3196 for (
size_t i = 1,
n = rClipRanges.
size();
i <
n; ++
i )
3198 ScRange const & rRange2 = rClipRanges[
i ];
3203 if (rRange2.
aEnd.
Col() > nEndCol)
3205 if (rRange2.
aEnd.
Row() > nEndRow)
3209 nClipX = nEndCol - nStartCol;
3211 if ( bIncludeFiltered )
3212 nClipY = nEndRow - nStartRow;
3217 SCTAB nCountTab = 0;
3224 nClipY = nResult - 1;
3235 if ( !rClipRanges.
empty() )
3243 OSL_FAIL(
"GetClipStart: No Clip");
3250 SCTAB nCountTab = 0;
3255 if ( rClipRanges.
empty() )
3258 for (
size_t i = 0,
n = rClipRanges.
size();
i <
n; ++
i )
3260 ScRange & rRange = rClipRanges[
i ];
3275 for (
SCTAB i = nTab1;
i <= nTab2 &&
i < nMinSizeBothTabs;
i++)
3279 if (!pTab || !pSrcTab)
3284 nFunction, bSkipEmpty, pSrcTab);
3290 bool bSkipEmpty,
bool bAsLink )
3314 for (
const SCTAB&
i : rMark)
3325 pMixDoc->InitUndo( *
this,
i,
i );
3328 pMixDoc->AddUndoTab(
i,
i );
3332 maTabs[
i]->CopyToTable(aMixCxt, nStartCol,nStartRow, nEndCol,nEndRow,
3334 nullptr,
false,
true,
3337 maTabs[
i]->DeleteArea( nStartCol,nStartRow, nEndCol,nEndRow, nDelFlags);
3338 maTabs[nSrcTab]->CopyToTable(aCxt, nStartCol,nStartRow, nEndCol,nEndRow,
3339 nFlags,
false,
maTabs[
i].
get(),
nullptr, bAsLink,
3340 true,
false,
true );
3343 maTabs[
i]->MixData(aMixDocCxt, nStartCol,nStartRow, nEndCol,nEndRow,
3344 nFunction, bSkipEmpty, pMixDoc->maTabs[
i].get() );
3352 OSL_FAIL(
"wrong table");
3358 bool bSkipEmpty,
bool bAsLink )
3381 for (
const SCTAB&
i : rMark)
3392 pMixDoc->InitUndo( *
this,
i,
i );
3395 pMixDoc->AddUndoTab(
i,
i );
3398 maTabs[
i]->CopyToTable(aMixCxt, nStartCol,nStartRow, nEndCol,nEndRow,
3404 maTabs[
i]->DeleteSelection( nDelFlags, rMark );
3405 maTabs[nSrcTab]->CopyToTable(aCxt, nStartCol,nStartRow, nEndCol,nEndRow,
3406 nFlags,
true,
maTabs[
i].
get(), &rMark, bAsLink,
3407 true,
false,
true );
3410 maTabs[
i]->MixMarked(aMixDocCxt, rMark, nFunction, bSkipEmpty, pMixDoc->maTabs[
i].get());
3418 OSL_FAIL(
"wrong table");
3430 if (pCurCellFormula && pCurCellFormula->
IsShared())
3444 return pTab->
SetString(nCol, nRow, nTab, rString, pParam);
3460 return maTabs[rPos.
Tab()]->SetEditText(rPos.
Col(), rPos.
Row(), std::move(pEditText));
3468 maTabs[rPos.
Tab()]->SetEditText(rPos.
Col(), rPos.
Row(), rEditText, pEditPool);
3529 if (pCurCellFormula && pCurCellFormula->
IsShared())
3548 return maTabs[nTab]->GetString(nCol, nRow, pContext);
3557 return maTabs[rPos.
Tab()]->GetString(rPos.
Col(), rPos.
Row(), pContext);
3595 return maTabs[nTab]->GetInputString( nCol, nRow, bForceSystemLocale );
3610 return FormulaError::NONE;
3630 SvNumFormatType::NUMBER,
3642 SvNumFormatType::NUMBER,
3661 return maTabs[nTab]->GetEditText(rPos.
Col(), rPos.
Row());
3669 return maTabs[rPos.
Tab()]->RemoveEditTextCharAttribs(rPos.
Col(), rPos.
Row(), rAttr);
3691 return maTabs[nTab]->GetNumberFormat( nCol, nRow );
3705 sal_uInt32 nFormat = 0;
3706 bool bFirstItem =
true;
3707 for (
SCTAB nTab = nTab1; nTab <= nTab2 && nTab < static_cast<SCTAB>(
maTabs.size()) ; ++nTab)
3708 for (
SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
3710 sal_uInt32 nThisFormat =
maTabs[nTab]->GetNumberFormat(nCol, nRow1, nRow2);
3713 nFormat = nThisFormat;
3716 else if (nThisFormat != nFormat)
3729 return maTabs[nTab]->GetNumberFormat( rContext, rPos );
3739 maTabs[nTab]->SetNumberFormat(rPos.
Col(), rPos.
Row(), nNumberFormat);
3748 nIndex =
maTabs[nTab]->GetNumberFormat( rContext, rPos );
3753 nType = SvNumFormatType::UNDEFINED;
3761 return maTabs[nTab]->GetFormula( nCol, nRow );
3786 return maTabs[nTab]->GetCellType( rPos );
3793 return maTabs[nTab]->GetCellType( nCol, nRow );
3801 && nCol <
maTabs[nTab]->GetAllocatedColumnsCount())
3802 return maTabs[nTab]->HasStringData( nCol, nRow );
3810 && nCol <
maTabs[nTab]->GetAllocatedColumnsCount())
3811 return maTabs[nTab]->HasValueData( nCol, nRow );
3832 for (
SCTAB nTab=nStartTab; nTab<=nEndTab && nTab < static_cast<SCTAB>(
maTabs.size()); nTab++ )
3871 a->CheckVectorizationState();
3886 a->SetAllFormulasDirty(rCxt);
3914 if (bIncludeEmptyCells)
3937 for (
size_t nPos=0, nRangeCount = rRanges.
size();
nPos < nRangeCount;
nPos++)
3957 bool allInterpreted =
true;
3958 for (
size_t nPos=0, nRangeCount = rRanges.
size();
nPos < nRangeCount;
nPos++)
3970 allInterpreted =
false;
3974 return allInterpreted;
3983 if (
p->bCollectNotifications )
3987 p->aNotifiedFormulaCells.push_back( pCell );
3991 p->aNotifiedFormulaCells.push_back( pCell );
3992 p->aNotifiedFormulaPos.push_back( pCell->
aPos );
4027 a->CompileAll(aCxt);
4054 pTab->CompileXML(aCxt, aProgress);
4076 bool bCompiled =
false;
4083 if (
a->CompileErrorCells(aCxt, nErrCode))
4101 a->CalcAfterLoad(aCxt, bStartListening);
4106 a->SetDirtyAfterLoad();
4119 for (
auto const& it : rListeners)
4131 return maTabs[nTab]->GetErrCode( rPos );
4132 return FormulaError::NONE;
4140 for (
SCTAB nTab = nTab1; nTab1 <= nTab2 && nTab <
nTabSize; ++nTab)
4142 maTabs[nTab]->ResetChanged(rRange);
4150 maTabs[nTab]->SetColWidth( nCol, nNewWidth );
4156 maTabs[nTab]->SetColWidthOnly( nCol, nNewWidth );
4162 maTabs[nTab]->SetRowHeight( nRow, nNewHeight );
4168 maTabs[nTab]->SetRowHeightRange
4169 ( nStartRow, nEndRow, nNewHeight, 1.0,
true );
4175 maTabs[nTab]->SetRowHeightOnly( nStartRow, nEndRow, nNewHeight );
4181 maTabs[nTab]->SetManualHeight( nStartRow, nEndRow, bManual );
4187 return maTabs[nTab]->GetColWidth( nCol, bHiddenAsZero );
4188 OSL_FAIL(
"wrong table number");
4204 return maTabs[nTab]->GetOriginalWidth( nCol );
4205 OSL_FAIL(
"wrong table number");
4212 return maTabs[nTab]->GetCommonWidth( nEndCol );
4213 OSL_FAIL(
"Wrong table number");
4220 return maTabs[nTab]->GetOriginalHeight( nRow );
4221 OSL_FAIL(
"Wrong table number");
4228 return maTabs[nTab]->GetRowHeight( nRow,
nullptr,
nullptr, bHiddenAsZero );
4229 OSL_FAIL(
"Wrong sheet number");
4236 return maTabs[nTab]->GetRowHeight( nRow, pStartRow, pEndRow, bHiddenAsZero );
4237 OSL_FAIL(
"Wrong sheet number");
4243 if (nStartRow == nEndRow)
4247 if (nStartRow > nEndRow)
4251 return maTabs[nTab]->GetRowHeight( nStartRow, nEndRow, bHiddenAsZero );
4253 OSL_FAIL(
"wrong sheet number");
4259 return maTabs[nTab]->GetRowForHeight(nHeight);
4263 SCTAB nTab,
double fScale )
const
4266 if (nStartRow == nEndRow)
4270 if (nStartRow > nEndRow)
4276 OSL_FAIL(
"wrong sheet number");
4283 return maTabs[nTab]->GetHiddenRowCount( nRow );
4284 OSL_FAIL(
"wrong table number");
4291 return maTabs[nTab]->GetColOffset( nCol, bHiddenAsZero );
4292 OSL_FAIL(
"wrong table number");
4299 return maTabs[nTab]->GetRowOffset( nRow, bHiddenAsZero );
4300 OSL_FAIL(
"wrong table number");
4312 rZoomX, rZoomY, bFormula, pMarkData, pParam );
4313 OSL_FAIL(
"wrong table number");
4321 bool bWidth,
bool bTotalSize,
bool bInPrintTwips )
4324 return maTabs[nTab]->GetNeededSize
4325 ( nCol, nRow, pDev,
nPPTX,
nPPTY, rZoomX, rZoomY, bWidth, bTotalSize, bInPrintTwips );
4326 OSL_FAIL(
"wrong table number");
4343 sal_uInt64 nCellCount = 0;
4344 for (
SCTAB nTab=0; nTab< static_cast<SCTAB>(
maTabs.size()); nTab++ )
4346 nCellCount +=
maTabs[nTab]->GetWeightedCount();
4350 sal_uInt64 nProgressStart = 0;
4351 for (
SCTAB nTab=0; nTab< static_cast<SCTAB>(
maTabs.size()); nTab++ )
4354 maTabs[nTab]->SetOptimalHeightOnly(rCxt, 0,
MaxRow(), &aProgress, nProgressStart);
4355 maTabs[nTab]->SetDrawPageSize();
4356 nProgressStart +=
maTabs[nTab]->GetWeightedCount();
4365 maTabs[nTab]->ShowCol( nCol, bShow );
4371 maTabs[nTab]->ShowRow( nRow, bShow );
4377 maTabs[nTab]->ShowRows( nRow1, nRow2, bShow );
4383 maTabs[nTab]->SetRowFlags( nRow, nNewFlags );
4389 maTabs[nTab]->SetRowFlags( nStartRow, nEndRow, nNewFlags );
4395 return maTabs[nTab]->GetColFlags( nCol );
4396 OSL_FAIL(
"wrong table number");
4403 return maTabs[nTab]->GetRowFlags( nRow );
4404 OSL_FAIL(
"wrong table number");
4412 maTabs[nTab]->GetAllRowBreaks(rBreaks, bPage, bManual);
4420 maTabs[nTab]->GetAllColBreaks(rBreaks, bPage, bManual);
4429 if (
maTabs[nTab]->HasRowPageBreak(nRow))
4432 if (
maTabs[nTab]->HasRowManualBreak(nRow))
4444 if (
maTabs[nTab]->HasColPageBreak(nCol))
4447 if (
maTabs[nTab]->HasColManualBreak(nCol))
4458 maTabs[nTab]->SetRowBreak(nRow, bPage, bManual);
4466 maTabs[nTab]->SetColBreak(nCol, bPage, bManual);
4474 maTabs[nTab]->RemoveRowBreak(nRow, bPage, bManual);
4482 maTabs[nTab]->RemoveColBreak(nCol, bPage, bManual);
4488 return Sequence<TablePageBreakData>();
4490 return maTabs[nTab]->GetRowBreakData();