20 #include <com/sun/star/uno/Reference.hxx>
21 #include <com/sun/star/chart/XChartDocument.hpp>
22 #include <com/sun/star/chart2/XChartDocument.hpp>
23 #include <com/sun/star/embed/XClassifiedObject.hpp>
24 #include <com/sun/star/embed/XEmbeddedObject.hpp>
43 #include <svx/svxids.hrc>
56 #include <osl/diagnose.h>
64 #include <document.hxx>
67 #include <globstr.hrc>
72 #include <charthelper.hxx>
82 #define DET_ARROW_OFFSET 1000
110 OSL_ENSURE(pData,
"ScUndoObjData: Data missing");
129 OSL_ENSURE(pData,
"ScUndoObjData: Data missing");
206 #define MAXMM 10000000
225 nClipEndX = nClipEndX + nClipStartX;
226 nClipEndY += nClipStartY;
228 return ScRange(nClipStartX, nClipStartY, nClipTab, nClipEndX, nClipEndY, nClipTab);
234 pGlobalDrawPersist ? pGlobalDrawPersist : (pDocument ? pDocument->GetDocumentShell() : nullptr)),
238 bAdjustEnabled( true ),
239 bHyphenatorSet(
false )
306 if ( pHitOutlinerPool )
327 Broadcast(
SdrHint(SdrHintKind::ModelCleared));
343 css::uno::Reference< css::linguistic2::XHyphenator >
363 for (sal_uInt16
i=0;
i<nCount && !bFound;
i++)
384 InsertPage(pPage.get(),
static_cast<sal_uInt16
>(nTab));
386 AddCalcUndo(std::make_unique<SdrUndoNewPage>(*pPage));
401 AddCalcUndo(std::make_unique<SdrUndoDelPage>(*pPage));
420 sal_uInt16 nMinPos = std::min(nOldPos, nNewPos);
434 if (pOldPage && pNewPage)
452 pNewObject->NbcMove(
Size(0,0));
462 AddCalcUndo( std::make_unique<SdrUndoInsertObj>( *pNewObject ) );
464 pOldObject = aIter.
Next();
478 if (nEnd >= nPageSize)
480 nEnd = nPageSize - 1;
482 for (
SCTAB i = nStart;
i <= nEnd; ++
i)
503 return rPos.
Col() >= nCol1 && rPos.
Col() <= nCol2 &&
504 rPos.
Row() >= nRow1 && rPos.
Row() <= nRow2;
508 SCCOL nDx,
SCROW nDy,
bool bUpdateNoteCaptionPos )
511 OSL_ENSURE(pPage,
"Page not found");
518 for (
size_t i = 0;
i < nCount; ++
i )
526 bool bChange =
false;
546 if ( pNoRotatedAnchor )
550 if ( aOldSttNoRotatedAnchor.
IsValid() &&
IsInBlock( aOldSttNoRotatedAnchor, nCol1,nRow1, nCol2,nRow2 ) )
555 if ( aOldEndNoRotatedAnchor.
IsValid() &&
IsInBlock( aOldEndNoRotatedAnchor, nCol1,nRow1, nCol2,nRow2 ) )
563 RecalcPos( pObj, *pData, bNegativePage, bUpdateNoteCaptionPos );
576 if ( rSize != pPage->
GetSize() )
599 for (
size_t i = 0;
i < nCount; ++
i )
608 switch (eObjectHandling)
611 RecalcPos(pObj, *pData, bNegativePage, bUpdateNoteCaptionPos);
622 RecalcPos(pObj, *pData, bNegativePage, bUpdateNoteCaptionPos);
626 switch (eObjectHandling)
658 Point aAvailableDiff(aWantedDiff);
661 if (aAvailableDiff.Y() > nHeight)
662 aAvailableDiff.setY( nHeight );
663 if (aAvailableDiff.X() > nWidth)
664 aAvailableDiff.setX( nWidth );
665 return aAvailableDiff;
672 return tools::Rectangle(static_cast<tools::Long>(aRange.getMinX()), static_cast<tools::Long>(aRange.getMinY()),
673 static_cast<tools::Long>(aRange.getMaxX()), static_cast<tools::Long>(aRange.getMaxY()));
680 if (std::abs(rRectA.
Left() - rRectB.
Left()) > 1)
682 if (std::abs(rRectA.
Top() - rRectB.
Top()) > 1)
684 if (std::abs(rRectA.
Right() - rRectB.
Right()) > 1)
691 bool lcl_NeedsMirrorYCorrection(
const SdrObject* pObj)
709 const bool bNeedsMirrorYCorrection = lcl_NeedsMirrorYCorrection(pObj);
710 if (bNeedsMirrorYCorrection)
714 const Point aRight(aLeft.X() + 1000, aLeft.Y());
722 Point aStartPoint(aStartCellRect.Left(), aStartCellRect.Top());
729 Point aEndPoint(aEndCellRect.Left(), aEndCellRect.Top());
735 aNewRectangle.Justify();
736 if (!lcl_AreRectanglesApproxEqual(pObj->
GetLogicRect(), aNewRectangle))
740 if (bNeedsMirrorYCorrection)
744 const Point aRight(aLeft.X() + 1000, aLeft.Y());
752 bool bNegativePage,
bool bCanResize)
765 aPos += lcl_calcAvailableDiff(*pDoc, nCol1, nRow1, nTab1, rData.
maStartOffset);
779 if (rData.
mbWasInHiddenRow || aLastCellRect.IsEmpty() || nRow1 != nRow2 || nCol1 != nCol2)
785 aEnd += lcl_calcAvailableDiff(*pDoc, nCol2, nRow2, nTab2, rData.
maEndOffset);
789 else if (!aLastCellRect.IsEmpty())
797 const tools::Long nLastWidth(aLastCellRect.GetWidth());
798 const tools::Long nLastHeight(aLastCellRect.GetHeight());
802 if(nCurrentWidth + 1 == nLastWidth || nCurrentWidth == nLastWidth + 1)
804 nCurrentWidth = nLastWidth;
807 if(nCurrentHeight + 1 == nLastHeight || nCurrentHeight == nLastHeight + 1)
809 nCurrentHeight = nLastHeight;
813 double fWidthFactor(nCurrentWidth == nLastWidth || 0 == nLastWidth
815 : static_cast<double>(nCurrentWidth) / static_cast<double>(nLastWidth));
816 double fHeightFactor(nCurrentHeight == nLastHeight || 0 == nLastHeight
818 : static_cast<double>(nCurrentHeight) / static_cast<double>(nLastHeight));
821 const bool bIsGrowing(nCurrentWidth > nLastWidth || nCurrentHeight > nLastHeight);
822 const bool bIsShrinking(nCurrentWidth < nLastWidth || nCurrentHeight < nLastHeight);
823 const bool bIsSizeChanged(bIsGrowing || bIsShrinking);
832 assert(nWidth &&
"div-by-zero");
833 double fMaxWidthFactor =
static_cast<double>(nCurrentWidth)
834 / static_cast<double>(nWidth);
836 assert(nHeight &&
"div-by-zero");
837 double fMaxHeightFactor =
static_cast<double>(nCurrentHeight)
838 / static_cast<double>(nHeight);
839 double fMaxFactor = std::min(fMaxHeightFactor, fMaxWidthFactor);
844 fWidthFactor = std::max(fWidthFactor, fHeightFactor);
846 else if(bIsShrinking)
848 fWidthFactor = std::min(fWidthFactor, fHeightFactor);
852 fWidthFactor = fHeightFactor = std::min(fWidthFactor, fMaxFactor);
859 bool bNeedToScale(bIsGrowing);
861 if(!bNeedToScale && bIsShrinking)
865 const bool bFitsInX(aRect.
Right() <= aCurrentCellRect.
Left() + nCurrentWidth);
866 const bool bFitsInY(aRect.
Bottom() <= aCurrentCellRect.
Top() + nCurrentHeight);
869 bNeedToScale = (!bFitsInX || !bFitsInY);
881 aChange.
scale(fWidthFactor, fHeightFactor);
939 pDoc->
GetMMRect(nCol1, nRow1, nCol1, nRow1, nTab1,
false ));
952 static_cast<SdrPathObj*>(pObj)->GetPathPoly().getB2DPolygon(0));
955 const Point aPointLT(
FRound(std::min(aB2DPoint0.getX(), aB2DPoint1.getX())),
956 FRound(std::min(aB2DPoint0.getY(), aB2DPoint1.getY())));
957 const Point aPointRB(
FRound(std::max(aB2DPoint0.getX(), aB2DPoint1.getX())),
958 FRound(std::max(aB2DPoint0.getY(), aB2DPoint1.getY())));
983 lcl_SetLogicRectFromAnchor(pObj, rNoRotatedAnchor, pDoc);
1023 OSL_ENSURE( pDoc,
"ScDrawLayer::RecalcPos - missing document" );
1029 OSL_ENSURE( rData.
maStart.
IsValid(),
"ScDrawLayer::RecalcPos - invalid position for cell note" );
1034 if( bUpdateNoteCaptionPos )
1040 pNote->UpdateCaptionPos( rData.
maStart );
1064 if ( bNegativePage )
1070 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
1096 if (!pDoc->
ColHidden(nCol1, nTab1,
nullptr, &nLastCol))
1097 aPos.AdjustX(pDoc->
GetColWidth( nCol1, nTab1 ) / 4 );
1098 if (!pDoc->
RowHidden(nRow1, nTab1,
nullptr, &nLastRow))
1102 Point aStartPos = aPos;
1103 if ( bNegativePage )
1104 aStartPos.setX( -aStartPos.X() );
1105 if ( pObj->
GetPoint( 0 ) != aStartPos )
1108 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
1117 if (aEndPos.Y() < 0)
1119 if ( bNegativePage )
1120 aEndPos.setX( -aEndPos.X() );
1121 if ( pObj->
GetPoint( 1 ) != aEndPos )
1124 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
1134 if (!pDoc->
ColHidden(nCol2, nTab2,
nullptr, &nLastCol))
1135 aPos.AdjustX(pDoc->
GetColWidth( nCol2, nTab2 ) / 4 );
1136 if (!pDoc->
RowHidden(nRow2, nTab2,
nullptr, &nLastRow))
1140 Point aEndPos = aPos;
1141 if ( bNegativePage )
1142 aEndPos.setX( -aEndPos.X() );
1143 if ( pObj->
GetPoint( 1 ) != aEndPos )
1146 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
1155 if (aStartPos.X() < 0)
1157 if (aStartPos.Y() < 0)
1159 if ( bNegativePage )
1160 aStartPos.setX( -aStartPos.X() );
1161 if ( pObj->
GetPoint( 0 ) != aStartPos )
1164 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
1193 if (!lcl_AreRectanglesApproxEqual(aNew, aOld))
1196 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
1201 if (pObj->
IsPolyObj() && nOldWidth && nOldHeight)
1204 Size aSizeMove(aNew.
Left()-aOld.Left(), aNew.
Top()-aOld.Top());
1207 double fXFrac =
static_cast<double>(aNew.
GetWidth()) / static_cast<double>(nOldWidth);
1208 double fYFrac =
static_cast<double>(aNew.
GetHeight()) / static_cast<double>(nOldHeight);
1229 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
1240 if (bEndAnchorIsBad)
1257 OSL_ENSURE( pDoc,
"ScDrawLayer::GetPrintArea without document" );
1262 OSL_ENSURE( rRange.
aEnd.
Tab() == nTab,
"GetPrintArea: Tab differ" );
1279 for (i=0; i<nStartCol; i++)
1283 for (i=nStartCol; i<=nEndCol; i++)
1297 if ( bNegativePage )
1301 ::std::swap( nStartX, nEndX );
1305 OSL_ENSURE(pPage,
"Page not found");
1316 if ( !bSetHor && ( aObjRect.
Right() < nStartX || aObjRect.
Left() > nEndX ) )
1318 if ( !bSetVer && ( aObjRect.
Bottom() < nStartY || aObjRect.
Top() > nEndY ) )
1325 if (aObjRect.
Left() < nStartX) nStartX = aObjRect.
Left();
1326 if (aObjRect.
Right() > nEndX) nEndX = aObjRect.
Right();
1330 if (aObjRect.
Top() < nStartY) nStartY = aObjRect.
Top();
1331 if (aObjRect.
Bottom() > nEndY) nEndY = aObjRect.
Bottom();
1336 pObject = aIter.
Next();
1340 if ( bNegativePage )
1344 ::std::swap( nStartX, nEndX );
1349 OSL_ENSURE( nStartX<=nEndX && nStartY<=nEndY,
"Start/End wrong in ScDrawLayer::GetPrintArea" );
1359 if (nWidth <= nStartX)
1364 if (nWidth > nStartX)
1374 if (nWidth <= nEndX)
1396 (nRow>0 ? (nRow-1) : 0));
1435 std::unique_ptr<SdrUndoGroup> pRet = std::move(
pUndoGroup);
1442 SCCOL nDx,
SCROW nDy,
bool bInsDel,
bool bUpdateNoteCaptionPos )
1444 OSL_ENSURE( pDoc,
"ScDrawLayer::MoveArea without document" );
1460 for (
SCCOL s=0; s<nDx; s++)
1463 for (
SCCOL s=-1; s>=nDx; s--)
1464 aMove.AdjustX( -(pDoc->
GetColWidth(s+nCol1,nTab)) );
1466 aMove.AdjustY(pDoc->
GetRowHeight( nRow1, nRow1+nDy-1, nTab) );
1468 aMove.AdjustY( -sal_Int16(pDoc->
GetRowHeight( nRow1+nDy, nRow1-1, nTab)) );
1470 if ( bNegativePage )
1471 aMove.setX( -aMove.X() );
1476 if ( aMove.X() != 0 && nDx < 0 )
1477 aTopLeft.AdjustX(aMove.X() );
1478 if ( aMove.Y() < 0 )
1479 aTopLeft.AdjustY(aMove.Y() );
1484 MoveCells( nTab, nCol1,nRow1, nCol2,nRow2, nDx,nDy, bUpdateNoteCaptionPos );
1489 OSL_ENSURE( pDoc,
"ScDrawLayer::HasObjectsInRows without document" );
1494 OSL_ENSURE(pPage,
"Page not found");
1506 if (nEndRow==pDoc->
MaxRow())
1521 if ( bNegativePage )
1524 bool bFound =
false;
1529 while ( pObject && !bFound )
1535 pObject = aIter.
Next();
1544 OSL_ENSURE( pDoc,
"ScDrawLayer::DeleteObjectsInArea without document" );
1549 OSL_ENSURE(pPage,
"Page ?");
1566 std::vector<SdrObject*> ppObj;
1567 ppObj.reserve(nObjCount);
1583 ppObj.push_back(pObject);
1594 ppObj.push_back(pObject);
1597 ppObj.push_back(pObject);
1602 pObject = aIter.
Next();
1606 for (
auto p : ppObj)
1609 for (
auto p : ppObj)
1615 OSL_ENSURE( pDoc,
"ScDrawLayer::DeleteObjectsInSelection without document" );
1625 for (
const SCTAB nTab : rMark)
1627 if (nTab >= nTabCount)
1642 std::vector<SdrObject*> ppObj;
1643 ppObj.reserve(nObjCount);
1655 bool bObjectInMarkArea =
1656 aMarkBound.
Contains(aObjRect) && rMark.IsAllMarked(aRange);
1659 bool bObjectAnchoredToMarkedCell
1661 && pObjData && rMark.IsCellMarked(pObjData->
maStart.
Col(),
1663 if (bObjectInMarkArea || bObjectAnchoredToMarkedCell)
1665 ppObj.push_back(pObject);
1669 pObject = aIter.
Next();
1675 for (
auto p : ppObj)
1678 for (
auto p : ppObj)
1706 bool bObjectInArea = rRange.
Contains(aObjRect);
1711 bObjectInArea = bObjectInArea || aClipRange.
Contains(pObjData->
maStart);
1729 pDestPage = pDestModel->
GetPage( static_cast<sal_uInt16>(nTab) );
1732 OSL_ENSURE( pDestPage,
"no page" );
1740 pNewObject->NbcMove(
Size(0,0));
1748 pOldObject = aIter.
Next();
1760 const ScRange & rRange = rRanges[
i ];
1761 if ( !rClipRange.
Contains( rRange ) )
1774 bool bChanged =
false;
1782 if ( rSourceRange.
Contains( rRange ) )
1787 if (!rRange.
Move( nDiffX, nDiffY, nDiffZ, aErrorRange, rDoc ))
1789 assert(!
"can't move range");
1802 OSL_ENSURE( pDoc,
"ScDrawLayer::CopyFromClip without document" );
1811 OSL_FAIL(
"CopyFromClip, bDrawIsInUndo");
1815 bool bMirrorObj = ( rSourceRange.
Left() < 0 && rSourceRange.
Right() < 0 &&
1816 rDestRange.
Left() > 0 && rDestRange.
Right() > 0 ) ||
1817 ( rSourceRange.
Left() > 0 && rSourceRange.
Right() > 0 &&
1818 rDestRange.
Left() < 0 && rDestRange.
Right() < 0 );
1825 SdrPage* pSrcPage = pClipModel->
GetPage(static_cast<sal_uInt16>(nSourceTab));
1827 OSL_ENSURE( pSrcPage && pDestPage,
"draw page missing" );
1828 if ( !pSrcPage || !pDestPage )
1838 bool bSameDoc = pDoc && pClipDoc && pDoc->
GetPool() == pClipDoc->
GetPool();
1843 OUString aDestTabName;
1844 bool bRestoreDestTabName =
false;
1845 if( pOldObject && !bSameDoc && !bDestClip )
1847 if( pDoc && pClipDoc )
1849 OUString aSourceTabName;
1850 if( pClipDoc->
GetName( nSourceTab, aSourceTabName )
1851 && pDoc->
GetName( nDestTab, aDestTabName ) )
1853 if( aSourceTabName != aDestTabName &&
1856 bRestoreDestTabName = pDoc->
RenameTab( nDestTab, aSourceTabName );
1863 Size aMove( rDestRange.
Left() - aMirroredSource.
Left(), rDestRange.
Top() - aMirroredSource.
Top() );
1870 tools::Long nWidthDiff = nDestWidth - nSourceWidth;
1871 tools::Long nHeightDiff = nDestHeight - nSourceHeight;
1875 bool bResize =
false;
1878 if ( std::abs(nWidthDiff) > 1 && nDestWidth > 1 && nSourceWidth > 1 )
1880 aHorFract =
Fraction( nDestWidth, nSourceWidth );
1883 if ( std::abs(nHeightDiff) > 1 && nDestHeight > 1 && nSourceHeight > 1 )
1885 aVerFract =
Fraction( nDestHeight, nSourceHeight );
1895 SCTAB nClipTab = bRestoreDestTabName ? nDestTab : nSourceTab;
1898 bool bObjectInArea = rSourceRange.
Contains(aObjRect);
1901 bObjectInArea = bObjectInArea || aClipRange.
Contains(pObjData->
maStart);
1911 pNewObject->NbcMove( aMove );
1913 pNewObject->NbcResize( aRefPos, aHorFract, aVerFract );
1917 AddCalcUndo( std::make_unique<SdrUndoInsertObj>( *pNewObject ) );
1921 if ( pNewObject->GetObjIdentifier() == SdrObjKind::OLE2 )
1923 uno::Reference< embed::XEmbeddedObject > xIPObj =
static_cast<SdrOle2Obj*
>(pNewObject)->GetObjRef();
1924 uno::Reference< embed::XClassifiedObject > xClassified = xIPObj;
1926 if ( xClassified.is() )
1929 aObjectClassName =
SvGlobalName( xClassified->getClassID() );
1930 }
catch( uno::Exception& )
1939 if( xNewChart.is() && !xNewChart->hasInternalDataProvider() )
1941 OUString aChartName =
static_cast<SdrOle2Obj*
>(pNewObject)->GetPersistName();
1942 ::std::vector< ScRangeList > aRangesVector;
1944 if( !aRangesVector.empty() )
1946 bool bInSourceRange =
false;
1953 if ( ( bInSourceRange || bSameDoc ) && !bDestClip )
1955 if ( bInSourceRange )
1957 if ( rDestPos != aClipRange.
aStart )
1960 if (
lcl_MoveRanges( aRangesVector, aClipRange, rDestPos, *pDoc ) )
1975 uno::Reference< chart::XChartDocument > xNewChartDoc( xNewChart, uno::UNO_QUERY );
1976 if( xOldChartDoc.is() && xNewChartDoc.is() )
1977 xNewChartDoc->attachData( xOldChartDoc->getData() );
1987 pOldObject = aIter.
Next();
1990 if( bRestoreDestTabName )
1991 pDoc->
RenameTab( nDestTab, aDestTabName );
1996 OSL_ENSURE( pDoc,
"ScDrawLayer::MirrorRTL - missing document" );
2004 bool bCanMirror = ( nIdent != SdrObjKind::Graphic && nIdent != SdrObjKind::OLE2 );
2022 if (!pNoRotatedAnchor)
2031 assert(pNoRotatedAnchor);
2034 Point aRef1( 0, 0 );
2035 Point aRef2( 0, 1 );
2037 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
2038 pObj->
Mirror( aRef1, aRef2 );
2044 const Point aMirroredLogicLT = aLogicLT +
Point(nInverseShift, 0);
2045 const Point aOffsetDiff = aMirroredLogicLT - aOldLogicRect.
TopLeft();
2052 Point aRef1( 0, 0 );
2053 Point aRef2( 0, 1 );
2055 AddCalcUndo( std::make_unique<SdrUndoGeoObj>( *pObj ) );
2056 pObj->
Mirror( aRef1, aRef2 );
2067 AddCalcUndo( std::make_unique<SdrUndoMoveObj>( *pObj, aMoveSize ) );
2068 pObj->
Move( aMoveSize );
2086 AddCalcUndo( std::make_unique<SdrUndoMoveObj>( *pObj, aMoveSize ) );
2087 pObj->
Move( aMoveSize );
2110 OSL_ENSURE( rDoc.
ValidColRowTab( rPos.
Col(), rPos.
Row(), rPos.
Tab() ),
"ScDrawLayer::GetCellRect - invalid cell address" );
2115 for(
SCCOL nCol = 0; nCol < rPos.
Col(); ++nCol )
2117 if( rPos.
Row() > 0 )
2130 Point aBotRight = aTopLeft;
2131 for(
SCCOL nCol = rPos.
Col(); nCol <= aEndPos.
Col(); ++nCol )
2156 if ( aName.isEmpty() )
2157 aName = static_cast<const SdrOle2Obj*>(pObj)->GetPersistName();
2167 return ( pObj->
GetName() == rName ||
2169 static_cast<const SdrOle2Obj*
>(pObj)->GetPersistName() == rName ) );
2175 for (sal_uInt16 nTab=0; nTab<nTabCount; nTab++)
2178 OSL_ENSURE(pPage,
"Page ?");
2188 rFoundTab =
static_cast<SCTAB>(nTab);
2192 pObject = aIter.
Next();
2202 OUString aBase =
ScResId(STR_GRAPHICNAME) +
" ";
2205 OUString aGraphicName;
2211 aGraphicName = aBase + OUString::number( nId );
2212 bThere = (
GetNamedObject( aGraphicName, SdrObjKind::NONE, nDummy ) != nullptr );
2218 return aGraphicName;
2226 for (sal_uInt16 nTab=0; nTab<nTabCount; nTab++)
2229 OSL_ENSURE(pPage,
"Page ?");
2245 pObject = aIter.
Next();
2256 for( sal_uInt16 i = 0;
i < nCount;
i++ )
2259 if( pData && pData->
GetInventor() == SdrInventor::ScOrSwDraw && pData->
GetId() == nId )
2265 void DeleteFirstUserDataOfType(
SdrObject *pObj, sal_uInt16 nId)
2268 for( sal_uInt16 i = nCount;
i > 0;
i-- )
2271 if( pData && pData->
GetInventor() == SdrInventor::ScOrSwDraw && pData->
GetId() == nId )
2298 bool bResizeWithCell )
2327 if (lcl_NeedsMirrorYCorrection(&rObj))
2331 const Point aRight(aLeft.X() + 1000, aLeft.Y());
2340 static_cast<SdrMeasureObj&
>(rObj).TakeUnrotatedSnapRect(aObjRect2);
2351 aObjRect2.
Move(
Size(-aSnapRect.Left() - aSnapRect.Right(), 0));
2411 pAnchor->
maEnd = aRange.aEnd;
2414 aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aEnd.Tab() );
2426 return GetFirstUserDataOfType(&rObj,
SC_UD_OBJDATA) !=
nullptr;
2463 std::vector<SdrObject*>
2468 return std::vector<SdrObject*>();
2470 std::vector<SdrObject*> aObjects;
2473 ScRange aRange( 0, nStartRow, nTab, pDoc->
MaxCol(), nEndRow, nTab);
2476 if (!dynamic_cast<SdrCaptionObj*>(pObject))
2479 if (pObjData && aRange.Contains(pObjData->
maStart))
2480 aObjects.push_back(pObject);
2482 pObject = aIter.
Next();
2487 std::map<SCROW, std::vector<SdrObject*>>
2492 return std::map<
SCROW, std::vector<SdrObject*>>();
2494 std::map<SCROW, std::vector<SdrObject*>> aRowObjects;
2497 ScRange aRange( nCol, nStartRow, nTab, nCol, nEndRow, nTab);
2500 if (!dynamic_cast<SdrCaptionObj*>(pObject))
2504 aRowObjects[pObjData->
maStart.
Row()].push_back(pObject);
2506 pObject = aIter.
Next();
2517 if (!pPage || pPage->GetObjCount() < 1)
2524 if (!dynamic_cast<SdrCaptionObj*>(pObject))
2530 pObject = aIter.
Next();
2540 return std::vector<SdrObject*>();
2542 std::vector<SdrObject*> aObjects;
2545 ScRange aRange(nStartCol, 0, nTab, nEndCol, pDoc->
MaxRow(), nTab);
2548 if (!dynamic_cast<SdrCaptionObj*>(pObject))
2551 if (pObjData && aRange.Contains(pObjData->
maStart))
2552 aObjects.push_back(pObject);
2554 pObject = aIter.
Next();
2569 pObjData->
maStart = rNewPosition;
2572 const SCCOL nObjectColSpan = aOldEnd.
Col() - aOldStart.
Col();
2573 const SCROW nObjectRowSpan = aOldEnd.
Row() - aOldStart.
Row();
2575 aNewEnd.
IncRow(nObjectRowSpan);
2576 aNewEnd.
IncCol(nObjectColSpan);
2577 pObjData->
maEnd = aNewEnd;
2580 RecalcPos(pObject, *pObjData,
false,
false);
2586 sal_uInt16 nFound = 0;
2587 for( sal_uInt16
i = 0;
i < nCount;
i++ )
2591 return static_cast<ScDrawObjData*>(pData);
2593 if( pObj && bCreate )
2607 if( pObj && bCreate )
2670 css::uno::Reference< css::uno::XInterface > xRet;
SdrOutliner & GetDrawOutliner(const SdrTextObj *pObj=nullptr) const
void BeginCalcUndo(bool bDisableTextEditUsesCommonUndoManager)
#define LINK(Instance, Class, Member)
std::map< SCROW, std::vector< SdrObject * > > GetObjectsAnchoredToRange(SCTAB nTab, SCCOL nCol, SCROW nStartRow, SCROW nEndRow)
void EnsureGraphicNames()
SCCOL GetColMerge() const
static void GetCellAnchorFromPosition(const tools::Rectangle &rRectangle, ScDrawObjData &rAnchor, const ScDocument &rDoc, SCTAB nTab, bool bHiddenAsZero=true)
static bool lcl_MoveRanges(::std::vector< ScRangeList > &rRangesVector, const ScRange &rSourceRange, const ScAddress &rDestPos, const ScDocument &rDoc)
static SfxObjectShell * pGlobalDrawPersist
virtual void TakeObjInfo(SdrObjTransformInfoRec &rInfo) const
SdrMetricItem makeSdrShadowYDistItem(tools::Long nDist)
void append(const basegfx::B2DPoint &rPoint, sal_uInt32 nCount)
constexpr TypedWhichId< SvxScriptSpaceItem > EE_PARA_ASIANCJKSPACING(EE_PARA_START+4)
void GetClipStart(SCCOL &nClipX, SCROW &nClipY)
virtual void SetSize(const Size &aSiz)
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
virtual const tools::Rectangle & GetCurrentBoundRect() const
std::vector< SdrObject * > GetObjectsAnchoredToRows(SCTAB nTab, SCROW nStartRow, SCROW nEndRow)
SCROW GetRowForHeight(SCTAB nTab, tools::Long nHeight) const
Given the height i.e.
void SetVOCInvalidationIsReliable(bool b)
OUString ScResId(TranslateId aId)
SC_DLLPUBLIC bool IsNegativePage(SCTAB nTab) const
void SetPoint(const Point &rPnt, sal_uInt32 i)
constexpr auto toTwips(N number, Length from)
void MirrorRTL(SdrObject *pObj)
virtual ~ScDrawLayer() override
void SetName(const OUString &rStr, const bool bSetChanged=true)
virtual bool IsPolyObj() const
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact)
static css::uno::Reference< css::chart2::XChartDocument > GetChartFromSdrObject(const SdrObject *pObject)
static void SetPageAnchored(SdrObject &)
LanguageType getLanguageType(bool bResolveSystem=true) const
ScUndoObjData(SdrObject *pObj, const ScAddress &rOS, const ScAddress &rOE, const ScAddress &rNS, const ScAddress &rNE)
std::unique_ptr< sal_Int32[]> pData
SdrObject * GetNamedObject(std::u16string_view rName, SdrObjKind nId, SCTAB &rFoundTab) const
static ScMacroInfo * GetMacroInfo(SdrObject *pObj, bool bCreate=false)
void ResetTab(SCTAB nStart, SCTAB nEnd)
static const AllSettings & GetSettings()
virtual Point GetRelativePos() const
SC_DLLPUBLIC bool ValidNewTabName(const OUString &rName) const
virtual void SetChanged(bool bFlg=true) override
static ScDrawObjData * GetObjData(SdrObject *pObj, bool bCreate=false)
constexpr Point convert(const Point &rPoint, o3tl::Length eFrom, o3tl::Length eTo)
css::uno::Reference< css::frame::XModel3 > GetModel() const
SdrObject * GetObj(size_t nNum) const
static bool IsCellAnchored(const SdrObject &rObj)
size_t GetObjCount() const
void PutInOrder(ScAddress &rAddress)
void DeleteObjectsInArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, bool bAnchored=false)
static void lcl_ReverseTwipsToMM(tools::Rectangle &rRect)
bool HasObjectsInRows(SCTAB nTab, SCROW nStartRow, SCROW nEndRow)
constexpr SdrLayerID SC_LAYER_BACK(1)
std::vector< SdrObject * > GetObjectsAnchoredToCols(SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol)
void CopyFromClip(ScDrawLayer *pClipModel, SCTAB nSourceTab, const tools::Rectangle &rSourceRange, const ScAddress &rDestPos, const tools::Rectangle &rDestRange)
static tools::Rectangle GetCellRect(const ScDocument &rDoc, const ScAddress &rPos, bool bMergedCell)
Returns the rectangle for the passed cell address in 1/100 mm.
void RecalcPos(SdrObject *pObj, ScDrawObjData &rData, bool bNegativePage, bool bUpdateNoteCaptionPos)
virtual ~ScTabDeletedHint() override
SC_DLLPUBLIC ScRange GetRange(SCTAB nTab, const tools::Rectangle &rMMRect, bool bHiddenAsZero=true) const
virtual SdrObjKind GetObjIdentifier() const
void DeleteObjectsInSelection(const ScMarkData &rMark)
virtual void InsertObject(SdrObject *pObj, size_t nPos=SAL_MAX_SIZE)
EmbeddedObjectRef * pObject
void GetClipArea(SCCOL &nClipX, SCROW &nClipY, bool bIncludeFiltered)
bool ValidColRowTab(SCCOL nCol, SCROW nRow, SCTAB nTab) const
constexpr TypedWhichId< SvxFontHeightItem > EE_CHAR_FONTHEIGHT(EE_CHAR_START+2)
static sal_uInt16 IsChart(const SvGlobalName &rName)
virtual void Redo() override
void MoveArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, SCCOL nDx, SCROW nDy, bool bInsDel, bool bUpdateNoteCaptionPos)
constexpr TypedWhichId< SvxFrameDirectionItem > EE_PARA_WRITINGDIR(EE_PARA_START+0)
constexpr TypedWhichId< ScMergeAttr > ATTR_MERGE(144)
SC_DLLPUBLIC sal_uInt16 GetRowHeight(SCROW nRow, SCTAB nTab, bool bHiddenAsZero=true) const
void MoveRTL(SdrObject *pObj)
virtual const tools::Rectangle & GetSnapRect() const
virtual css::uno::Reference< css::uno::XInterface > createUnoModel() override
constexpr auto convertTwipToMm100(N n)
SC_DLLPUBLIC ScDocumentPool * GetPool()
SC_DLLPUBLIC ScPostIt * GetNote(const ScAddress &rPos)
static void SetGlobalDrawPersist(SfxObjectShell *pPersist)
void setShapeRect(const ScDocument *rDoc, tools::Rectangle rNewRect, bool bIsVisible=true)
static bool lcl_IsAllInRange(const ::std::vector< ScRangeList > &rRangesVector, const ScRange &rClipRange)
void EnableUndo(bool bEnable)
void SetChartListenerCollectionNeedsUpdate(bool bFlg)
virtual ~ScUndoObjData() override
SC_DLLPUBLIC bool RenameTab(SCTAB nTab, const OUString &rName, bool bExternalDocument=false)
ScUndoAnchorData(SdrObject *pObj, ScDocument *pDoc, SCTAB nTab)
SdrPage * getSdrPageFromSdrObject() const
SC_DLLPUBLIC SCROW MaxRow() const
SC_DLLPUBLIC SCTAB GetTableCount() const
BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix &rMatrix)
Additional class containing cell annotation data.
bool IsMultiMarked() const
void setB2DPoint(sal_uInt32 nIndex, const basegfx::B2DPoint &rValue)
virtual void SetChanged(bool bFlg=true)
void SetName(const OUString &rName)
B2IRange fround(const B2DRange &rRange)
virtual void TakeUnrotatedSnapRect(tools::Rectangle &rRect) const override
SC_DLLPUBLIC const SfxPoolItem * GetAttr(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt16 nWhich) const
static XColorListRef GetStdColorList()
void ScMovePage(sal_uInt16 nOldPos, sal_uInt16 nNewPos)
const LanguageTag & GetLanguageTag() const
SdrOutliner & GetHitTestOutliner() const
virtual void DeletePage(sal_uInt16 nPgNum)
virtual void Redo() override
ScDocument * GetDocument() const
const SfxPoolItem * GetItem(sal_uInt16 nSlotId) const
const tools::Rectangle & getShapeRect() const
SC_DLLPUBLIC ScDrawLayer * GetDrawLayer()
SC_DLLPUBLIC SCCOL MaxCol() const
SC_DLLPUBLIC bool ColHidden(SCCOL nCol, SCTAB nTab, SCCOL *pFirstCol=nullptr, SCCOL *pLastCol=nullptr) const
const OUString & GetControlLayerName() const
bool GetPrintArea(ScRange &rRange, bool bSetHor, bool bSetVer) const
UNDERLYING_TYPE get() const
SC_DLLPUBLIC void InitDrawLayer(SfxObjectShell *pDocShell=nullptr)
static void SetCellAnchored(SdrObject &, const ScDrawObjData &rAnchor)
bool IsImportingXML() const
rtl::Reference< SfxItemPool > m_pItemPool
void IncCol(SCCOL nDelta=1)
tools::Long FRound(double fVal)
virtual void NbcMirror(const Point &rRef1, const Point &rRef2)
ScDrawLayer(ScDocument *pDocument, const OUString &rName)
static ScAnchorType GetAnchorType(const SdrObject &)
static ScDrawObjData * GetNoteCaptionData(SdrObject *pObj, SCTAB nTab)
Returns the object data, if the passed object is a cell note caption.
static void SetCellAnchoredFromPosition(SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab, bool bResizeWithCell)
virtual void AdjustToMaxRect(const tools::Rectangle &rMaxRect, bool bShrinkOnly=false)
static ScRange lcl_getClipRangeFromClipDoc(ScDocument *pClipDoc, SCTAB nClipTab)
void ResizeLastRectFromAnchor(const SdrObject *pObj, ScDrawObjData &rData, bool bNegativePage, bool bCanResize)
static css::uno::Reference< css::linguistic2::XHyphenator > GetHyphenator()
void BroadcastObjectChange() const
virtual ~ScUndoAnchorData() override
const SdrPage * GetPage(sal_uInt16 nPgNum) const
SdrLayer * NewLayer(const OUString &rName, sal_uInt16 nPos=0xFFFF)
static bool IsNamedObject(const SdrObject *pObj, std::u16string_view rName)
void SetCalcFieldValueHdl(const Link< EditFieldInfo *, void > &rLink)
void IncRow(SCROW nDelta=1)
bool ScAddPage(SCTAB nTab)
void DeleteUserData(sal_uInt16 nNum)
void scale(double fX, double fY)
SdrModel & getSdrModelFromSdrObject() const
void MoveObject(SdrObject *pObj, const ScAddress &rNewPosition)
void AddCalcUndo(std::unique_ptr< SdrUndoAction > pUndo)
void SetVisible(bool bVisible)
virtual void SetLogicRect(const tools::Rectangle &rRect)
OUString GetNewGraphicName(tools::Long *pnCounter=nullptr) const
virtual void Move(const Size &rSiz)
SfxItemPool * GetEditTextObjectPool() const
static bool IsInBlock(const ScAddress &rPos, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
bool IsResizeProtect() const
SC_DLLPUBLIC tools::Rectangle GetMMRect(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, bool bHiddenAsZero=true) const
SC_DLLPUBLIC tools::Long GetRowOffset(SCROW nRow, SCTAB nTab, bool bHiddenAsZero=true) const
const XColorListRef & GetColorList() const
virtual void Undo() override
virtual void SetRelativePos(const Point &rPnt)
virtual SdrObject * RemoveObject(size_t nObjNum)
bool Move(SCCOL aDeltaX, SCROW aDeltaY, SCTAB aDeltaZ, ScRange &rErrorRange, const ScDocument &rDoc)
virtual void Mirror(const Point &rRef1, const Point &rRef2)
B2DRange getRange(const B2DPolygon &rCandidate)
void AppendUserData(std::unique_ptr< SdrObjUserData > pData)
virtual SdrLayerID GetLayer() const
SfxItemPool * GetSecondaryPool() const
void MoveCells(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, SCCOL nDx, SCROW nDy, bool bUpdateNoteCaptionPos)
void SetPageSize(sal_uInt16 nPageNo, const Size &rSize, bool bUpdateNoteCaptionPos, const ScObjectHandling eObjectHandling=ScObjectHandling::RecalcPosMode)
virtual void Undo() override
void SetDefaultMetric(MapUnit eNewMetric)
constexpr SdrLayerID SC_LAYER_HIDDEN(4)
void ScRenamePage(SCTAB nTab, const OUString &rNewName)
std::unique_ptr< SdrUndoGroup > GetCalcUndo()
constexpr TypedWhichId< SvxFontHeightItem > EE_CHAR_FONTHEIGHT_CTL(EE_CHAR_START+20)
virtual void NbcSetLogicRect(const tools::Rectangle &rRect)
SdrMetricItem makeSdrShadowXDistItem(tools::Long nDist)
static ScDrawObjData * GetObjDataTab(SdrObject *pObj, SCTAB nTab)
virtual void NbcMove(const Size &rSiz)
constexpr SdrLayerID SC_LAYER_FRONT(0)
static ScDrawObjData * GetNonRotatedObjData(SdrObject *pObj, bool bCreate=false)
virtual rtl::Reference< SdrPage > AllocPage(bool bMasterPage) override
SdrObjUserData * GetUserData(sal_uInt16 nNum) const
constexpr SdrLayerID SC_LAYER_INTERN(2)
static void MirrorRectRTL(tools::Rectangle &rRect)
static void UpdateCellAnchorFromPositionEnd(const SdrObject &rObj, ScDrawObjData &rAnchor, const ScDocument &rDoc, SCTAB nTab, bool bUseLogicRect=true)
virtual SdrObject * CloneSdrObject(SdrModel &rTargetModel) const
static OUString GetVisibleName(const SdrObject *pObj)
std::unique_ptr< SdrUndoGroup > pUndoGroup
bool Contains(const ScAddress &) const
is Address& fully in Range?
void InitializeCellAnchoredObj(SdrObject *pObj, ScDrawObjData &rData)
static bool isKorean(LanguageType nLang)
SC_DLLPUBLIC void GetChartRanges(std::u16string_view rChartName, std::vector< ScRangeList > &rRanges, const ScDocument &rSheetNameDoc)
sal_uInt16 GetUserDataCount() const
void translate(double fX, double fY)
virtual ~ScTabSizeChangedHint() override
SC_DLLPUBLIC bool RowHidden(SCROW nRow, SCTAB nTab, SCROW *pFirstRow=nullptr, SCROW *pLastRow=nullptr) const
virtual void MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos)
SC_DLLPUBLIC ScColumnsRange GetColumnsRange(SCTAB nTab, SCCOL nColBegin, SCCOL nColEnd) const
bool HasObjectsAnchoredInRange(const ScRange &rRange)
virtual void SetSnapRect(const tools::Rectangle &rRect)
virtual bool shouldKeepAspectRatio() const
static bool IsNoteCaption(SdrObject *pObj)
Returns true, if the passed object is the caption of a cell note.
SfxObjectShell * GetDocumentShell() const
SC_DLLPUBLIC tools::Long GetColOffset(SCCOL nCol, SCTAB nTab, bool bHiddenAsZero=true) const
bool IsUndoEnabled() const
constexpr TypedWhichId< SvxFontHeightItem > EE_CHAR_FONTHEIGHT_CJK(EE_CHAR_START+19)
const SfxItemPool & GetItemPool() const
SCROW GetRowMerge() const
void SetScaleUnit(MapUnit eMap)
virtual const tools::Rectangle & GetLogicRect() const
void ScCopyPage(sal_uInt16 nOldPos, sal_uInt16 nNewPos)
ScTabDeletedHint(SCTAB nTabNo)
static E3dObjFactory * pF3d
void SetDisableTextEditUsesCommonUndoManager(bool bNew)
static void SetNonRotatedAnchor(SdrObject &, const ScDrawObjData &rAnchor)
const SdrLayerAdmin & GetLayerAdmin() const
SC_DLLPUBLIC sal_uInt16 GetColWidth(SCCOL nCol, SCTAB nTab, bool bHiddenAsZero=true) const
void SetChartRanges(std::u16string_view rChartName, const std::vector< ScRangeList > &rRanges)
SdrInventor GetInventor() const
void SetPropertyList(XPropertyListRef const &p)
virtual Point GetPoint(sal_uInt32 i) const
#define LANGUAGE_JAPANESE
void ClearModel(bool bCalledFromDestructor)
void ScRemovePage(SCTAB nTab)
constexpr SdrLayerID SC_LAYER_CONTROLS(3)
const tools::Rectangle & getLastCellRect() const
const OUString & GetName() const
SC_DLLPUBLIC bool GetName(SCTAB nTab, OUString &rName) const
const ScRange & GetMultiMarkArea() const
ScTabSizeChangedHint(SCTAB nTabNo)
static bool IsResizeWithCell(const SdrObject &rObj)
sal_uInt16 GetPageCount() const
void SetPoolDefaultItem(const SfxPoolItem &)
bool m_bDetectedRangeSegmentation false
basegfx::B2DPoint const & getB2DPoint(sal_uInt32 nIndex) const
void CopyToClip(ScDocument *pClipDoc, SCTAB nTab, const tools::Rectangle &rRange)
virtual SdrModel * AllocModel() const override