22 #include <com/sun/star/frame/XModel.hpp>
23 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
24 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
25 #include <com/sun/star/text/XTextTable.hpp>
26 #include <com/sun/star/table/XCellRange.hpp>
106 m_pStartNode( nullptr ),
107 m_nRowSpan( nRSpan ),
108 m_nColSpan( nCSpan ),
110 m_bHasValue(
false ),
112 , m_bHasStringValue(
false)
115 inline void Set(
const OUString& rStyleName,
116 sal_uInt32 nRSpan, sal_uInt32 nCSpan,
119 const OUString* pFormula,
123 OUString
const*
const pStringValue);
125 bool IsUsed()
const {
return m_pStartNode!=
nullptr ||
131 void SetStyleName(
const OUString& rStyleName) { m_aStyleName = rStyleName; }
140 return m_bHasStringValue ? &m_StringValue :
nullptr;
152 sal_uInt32 nRSpan, sal_uInt32 nCSpan,
156 const OUString* pFormula,
160 OUString
const*
const pStringValue )
178 if (pFormula !=
nullptr)
205 std::vector<std::unique_ptr<SwXMLTableCell_Impl>>
m_Cells;
211 const OUString *pDfltCellStyleName =
nullptr );
215 inline void Set(
const OUString& rStyleName,
216 const OUString& rDfltCellStyleName );
218 void Expand( sal_uInt32 nCells,
bool bOneCell );
231 const OUString *pDfltCellStyleName ) :
232 m_aStyleName( rStyleName ),
233 m_bSplitable(
false )
235 if( pDfltCellStyleName )
237 OSL_ENSURE( nCells <= USHRT_MAX,
238 "SwXMLTableRow_Impl::SwXMLTableRow_Impl: too many cells" );
239 if( nCells > USHRT_MAX )
242 for( sal_uInt32
i=0
U;
i<nCells; ++
i )
244 m_Cells.push_back(std::make_unique<SwXMLTableCell_Impl>());
250 OSL_ENSURE( nCol < USHRT_MAX,
251 "SwXMLTableRow_Impl::GetCell: column number is too big" );
253 OSL_ENSURE( nCol <
m_Cells.size(),
254 "SwXMLTableRow_Impl::GetCell: column number is out of bound" );
260 OSL_ENSURE( nCells <= USHRT_MAX,
261 "SwXMLTableRow_Impl::Expand: too many cells" );
262 if( nCells > USHRT_MAX )
265 sal_uInt32 nColSpan = nCells -
m_Cells.size();
266 for (
size_t i =
m_Cells.size();
i < nCells; ++
i)
268 m_Cells.push_back(std::make_unique<SwXMLTableCell_Impl>(
269 1
UL, bOneCell ? nColSpan : 1
UL));
273 OSL_ENSURE( nCells <=
m_Cells.size(),
274 "SwXMLTableRow_Impl::Expand: wrong number of cells" );
278 const OUString& rDfltCellStyleName )
296 OUString m_aStyleName;
298 OUString m_sSaveParaDefault;
299 OUString m_StringValue;
305 bool m_bHasStringValue;
306 bool m_bValueTypeIsString;
309 sal_uInt32 m_nRowSpan;
310 sal_uInt32 m_nColSpan;
311 sal_uInt32 m_nColRepeat;
313 bool m_bHasTextContent : 1;
314 bool m_bHasTableContent : 1;
318 bool HasContent()
const {
return m_bHasTextContent || m_bHasTableContent; }
319 inline void InsertContent_();
320 inline void InsertContent();
325 SwXMLTableCellContext_Impl(
327 const Reference< xml::sax::XFastAttributeList > & xAttrList,
332 const Reference< xml::sax::XFastAttributeList > & xAttrList )
override;
333 virtual void SAL_CALL
endFastElement(sal_Int32 nElement)
override;
343 const Reference<xml::sax::XFastAttributeList>& xAttrList,
347 SwXMLCoveredTableCellContext::SwXMLCoveredTableCellContext(
348 SwXMLImport& rImport,
const Reference<xml::sax::XFastAttributeList>& xAttrList,
355 switch (rIter.getToken())
363 if (!aStyleName.isEmpty())
370 SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl(
372 const Reference< xml::sax::XFastAttributeList > & xAttrList,
375 m_xMyTable( pTable ),
377 m_bHasValue(
false ),
378 m_bHasStringValue(
false),
379 m_bValueTypeIsString(
false),
384 m_bHasTextContent(
false ),
385 m_bHasTableContent(
false )
387 m_sSaveParaDefault = GetImport().GetTextImport()->GetCellParaStyleDefault();
390 switch( aIter.getToken() )
394 GetImport().GetTextImport()->SetCellParaStyleDefault(m_aStyleName);
396 case XML_ELEMENT(TABLE, XML_NUMBER_COLUMNS_SPANNED):
397 m_nColSpan = static_cast<sal_uInt32>(
std::
max<sal_Int32>(1, aIter.
toInt32()));
398 if (m_nColSpan > 256)
400 SAL_INFO(
"sw.xml",
"ignoring huge table:number-columns-spanned " << m_nColSpan);
405 m_nRowSpan = static_cast<sal_uInt32>(
std::
max<sal_Int32>(1, aIter.
toInt32()));
408 SAL_INFO(
"sw.xml",
"ignoring huge table:number-rows-spanned " << m_nRowSpan);
412 case XML_ELEMENT(TABLE, XML_NUMBER_COLUMNS_REPEATED):
413 m_nColRepeat = static_cast<sal_uInt32>(
std::
max<sal_Int32>(1, aIter.
toInt32()));
414 if (m_nColRepeat > 256)
416 SAL_INFO(
"sw.xml",
"ignoring huge table:number-columns-repeated " << m_nColRepeat);
423 const sal_uInt16 nPrefix2 = GetImport().GetNamespaceMap().
424 GetKeyByAttrValueQName(aIter.toString(), &sTmp);
453 if (GetImport().GetMM100UnitConverter().convertDateTime(fTmp,
466 m_fValue = (bTmp ? 1.0 : 0.0);
483 m_StringValue = aIter.toString();
484 m_bHasStringValue =
true;
489 if (
"string" == aIter.toView())
491 m_bValueTypeIsString =
true;
504 inline void SwXMLTableCellContext_Impl::InsertContent_()
506 SwStartNode const*
const pStartNode( GetTable()->InsertTableSection(
nullptr,
507 (m_bHasStringValue && m_bValueTypeIsString &&
508 !m_aStyleName.isEmpty()) ? & m_aStyleName :
nullptr) );
509 GetTable()->InsertCell( m_aStyleName, m_nRowSpan, m_nColSpan,
511 nullptr, m_bProtect, &m_sFormula, m_bHasValue, m_fValue,
512 (m_bHasStringValue && m_bValueTypeIsString) ? &m_StringValue :
nullptr);
515 inline void SwXMLTableCellContext_Impl::InsertContent()
517 OSL_ENSURE( !HasContent(),
"content already there" );
518 m_bHasTextContent =
true;
522 inline void SwXMLTableCellContext_Impl::InsertContent(
525 GetTable()->InsertCell( m_aStyleName, m_nRowSpan, m_nColSpan,
nullptr, pTable, m_bProtect );
526 m_bHasTableContent =
true;
529 css::uno::Reference<css::xml::sax::XFastContextHandler> SwXMLTableCellContext_Impl::createFastChildContext(
531 const Reference< xml::sax::XFastAttributeList > & xAttrList )
535 bool bSubTable =
false;
540 if( aIter.getToken() ==
XML_ELEMENT(TABLE, XML_IS_SUB_TABLE) )
557 pContext = pTableContext;
558 if( GetTable()->IsValid() )
559 InsertContent( pTableContext );
561 GetTable()->SetHasSubTables(
true );
566 if( GetTable()->IsValid() && !HasContent() )
569 if (!(m_bValueTypeIsString && m_bHasStringValue))
571 pContext = GetImport().GetTextImport()->CreateTextChildContext(
572 GetImport(), nElement, xAttrList,
580 void SwXMLTableCellContext_Impl::endFastElement(sal_Int32 )
582 if( GetTable()->IsValid() )
584 if( m_bHasTextContent )
586 GetImport().GetTextImport()->DeleteParagraph();
587 if( m_nColRepeat > 1 && m_nColSpan == 1 )
591 Reference < XTextCursor > xSrcTextCursor =
592 GetImport().GetTextImport()->GetText()->createTextCursor();
593 xSrcTextCursor->gotoEnd(
true );
596 Reference<XUnoTunnel> xSrcCursorTunnel( xSrcTextCursor, UNO_QUERY);
597 assert(xSrcCursorTunnel.is() &&
"missing XUnoTunnel for Cursor");
598 OTextCursorHelper *pSrcTextCursor = comphelper::getFromUnoTunnel<OTextCursorHelper>(xSrcTextCursor);
599 assert(pSrcTextCursor &&
"SwXTextCursor missing");
600 SwDoc *pDoc = pSrcTextCursor->GetDoc();
601 const SwPaM *pSrcPaM = pSrcTextCursor->GetPaM();
603 while( m_nColRepeat > 1 && GetTable()->IsInsertCellPossible() )
607 Reference<XUnoTunnel> xDstCursorTunnel(
608 GetImport().GetTextImport()->GetCursor(), UNO_QUERY);
609 assert(xDstCursorTunnel.is() &&
"missing XUnoTunnel for Cursor");
610 OTextCursorHelper *pDstTextCursor = comphelper::getFromUnoTunnel<OTextCursorHelper>(GetImport().GetTextImport()->GetCursor());
611 assert(pDstTextCursor &&
"SwXTextCursor missing");
613 SwPosition aDstPos( *pDstTextCursor->GetPaM()->GetPoint() );
620 else if( !m_bHasTableContent )
623 if( m_nColRepeat > 1 && m_nColSpan == 1 )
625 while( m_nColRepeat > 1 && GetTable()->IsInsertCellPossible() )
633 GetImport().GetTextImport()->SetCellParaStyleDefault(m_sSaveParaDefault);
646 SwXMLTableColContext_Impl(
648 const Reference< xml::sax::XFastAttributeList > & xAttrList,
656 SwXMLTableColContext_Impl::SwXMLTableColContext_Impl(
658 const Reference< xml::sax::XFastAttributeList > & xAttrList,
663 sal_uInt32 nColRep = 1;
664 OUString aStyleName, aDfltCellStyleName;
668 switch (aIter.getToken())
673 case XML_ELEMENT(TABLE, XML_NUMBER_COLUMNS_REPEATED):
675 nColRep =
static_cast<sal_uInt32
>(std::max<sal_Int32>(1, aIter.toInt32()));
678 SAL_INFO(
"sw.xml",
"ignoring huge table:number-columns-repeated " << nColRep);
683 case XML_ELEMENT(TABLE, XML_DEFAULT_CELL_STYLE_NAME):
684 aDfltCellStyleName = aIter.
toString();
696 sal_Int32 nWidth =
MINLAY;
697 bool bRelWidth =
true;
698 if( !aStyleName.isEmpty() )
702 if( GetSwImport().FindAutomaticStyle(
703 XmlStyleFamily::TABLE_COLUMN,
704 aStyleName, &pAutoItemSet ) &&
708 nWidth = pSize->GetWidth();
715 while( nColRep-- && GetTable()->IsInsertColPossible() )
716 GetTable()->InsertColumn( nWidth, bRelWidth, &aDfltCellStyleName );
730 SwXMLTableColsContext_Impl(
735 sal_Int32 Element,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList )
override;
742 SwXMLTableColsContext_Impl::SwXMLTableColsContext_Impl(
750 css::uno::Reference< css::xml::sax::XFastContextHandler > SwXMLTableColsContext_Impl::createFastChildContext(
751 sal_Int32 nElement,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList )
755 if( nElement ==
XML_ELEMENT(TABLE, XML_TABLE_COLUMN) &&
756 GetTable()->IsInsertColPossible() )
757 pContext =
new SwXMLTableColContext_Impl( GetSwImport(), xAttrList, GetTable() );
770 sal_uInt32 m_nRowRepeat;
776 SwXMLTableRowContext_Impl(
778 const Reference< xml::sax::XFastAttributeList > & xAttrList,
781 virtual css::uno::Reference<css::xml::sax::XFastContextHandler> SAL_CALL
createFastChildContext( sal_Int32 nElement,
782 const Reference< xml::sax::XFastAttributeList > & xAttrList )
override;
784 virtual void SAL_CALL
endFastElement(sal_Int32 nElement)
override;
791 SwXMLTableRowContext_Impl::SwXMLTableRowContext_Impl(
SwXMLImport& rImport,
793 const Reference< xml::sax::XFastAttributeList > & xAttrList,
797 m_xMyTable( pTable ),
800 OUString aStyleName, aDfltCellStyleName;
804 switch(aIter.getToken())
811 m_nRowRepeat =
static_cast<sal_uInt32
>(std::max<sal_Int32>(1, aIter.toInt32()));
814 SAL_INFO(
"sw.xml",
"ignoring huge table:number-rows-repeated " << m_nRowRepeat);
819 case XML_ELEMENT(STYLE, XML_DEFAULT_CELL_STYLE_NAME):
820 aDfltCellStyleName = aIter.
toString();
828 if( GetTable()->IsValid() )
829 GetTable()->InsertRow( aStyleName, aDfltCellStyleName, bInHead );
832 void SwXMLTableRowContext_Impl::endFastElement(sal_Int32 )
834 if( GetTable()->IsValid() )
836 GetTable()->FinishRow();
838 if( m_nRowRepeat > 1 )
839 GetTable()->InsertRepRows( m_nRowRepeat );
843 css::uno::Reference<css::xml::sax::XFastContextHandler> SwXMLTableRowContext_Impl::createFastChildContext(
845 const Reference< xml::sax::XFastAttributeList > & xAttrList )
849 if( nElement ==
XML_ELEMENT(TABLE, XML_TABLE_CELL) ||
852 if( !GetTable()->IsValid() || GetTable()->IsInsertCellPossible() )
853 pContext =
new SwXMLTableCellContext_Impl( GetSwImport(), nElement,
857 else if( nElement ==
XML_ELEMENT(TABLE, XML_COVERED_TABLE_CELL) ||
858 nElement ==
XML_ELEMENT(LO_EXT, XML_COVERED_TABLE_CELL) )
860 if (GetTable()->IsValid() && GetTable()->IsInsertCoveredCellPossible())
862 pContext =
new SwXMLCoveredTableCellContext(GetSwImport(), xAttrList, *GetTable());
893 const Reference< xml::sax::XFastAttributeList > & xAttrList )
override;
900 SwXMLTableRowsContext_Impl::SwXMLTableRowsContext_Impl(
SwXMLImport& rImport,
904 m_xMyTable( pTable ),
909 css::uno::Reference<css::xml::sax::XFastContextHandler> SwXMLTableRowsContext_Impl::createFastChildContext(
911 const Reference< xml::sax::XFastAttributeList > & xAttrList )
913 if( nElement==
XML_ELEMENT(TABLE, XML_TABLE_ROW ) &&
914 GetTable()->IsInsertRowPossible() )
915 return new SwXMLTableRowContext_Impl( GetSwImport(), nElement,
938 const Reference<xml::sax::XFastAttributeList> & xAttrList)
override;
950 m_bIsAutomaticUpdate(
false)
956 const Reference<xml::sax::XFastAttributeList> & xAttrList)
960 switch (aIter.getToken())
993 const OUString sPrefixStr(sPrefix.isEmpty() ? OUString(
"_") : sPrefix);
1005 sName = sPrefixStr + OUString::number(nCount);
1024 ? SfxLinkUpdateMode::ALWAYS
1025 : SfxLinkUpdateMode::ONCALL;
1033 if (
sName.isEmpty())
1042 if (
nullptr != pOldType)
1045 if ( (pOldType->
GetCmd() == sCommand) &&
1046 (pOldType->
GetType() == nType) )
1062 if (
nullptr == pType)
1070 OSL_ENSURE(
nullptr != pType,
"We really want a SwDDEFieldType here!");
1085 mbProtected( bProtected )
1090 return (rArg.
mnWidth == mnWidth) &&
1106 sal_uInt32 nCol )
const
1108 return (*
m_pRows)[nRow]->GetCell( nCol );
1114 return (*
m_pRows)[nRow]->GetCell( nCol );
1119 const Reference< xml::sax::XFastAttributeList > & xAttrList ) :
1122 m_pTableNode( nullptr ),
1124 m_bOwnsBox1(
false ),
1125 m_pSttNd1( nullptr ),
1126 m_pBoxFormat( nullptr ),
1127 m_pLineFormat( nullptr ),
1128 m_bFirstSection( true ),
1129 m_bRelWidth( true ),
1130 m_bHasSubTables(
false ),
1134 m_nNonMergedCurCol( 0 ),
1145 const OUString sValue = aIter.toString();
1146 switch(aIter.getToken())
1149 m_aStyleName = sValue;
1154 case XML_ELEMENT(TABLE, XML_DEFAULT_CELL_STYLE_NAME):
1170 OUString sTableName;
1171 if( !aName.isEmpty() )
1177 if( sTableName.isEmpty() )
1181 ->GetRenameMap().Add( XML_TEXT_RENAME_TYPE_TABLE, aName, sTableName );
1184 Reference< XTextTable > xTable;
1188 OSL_ENSURE(
xFactory.is(),
"factory missing" );
1191 Reference<XInterface> xIfc =
xFactory->createInstance(
"com.sun.star.text.TextTable" );
1192 OSL_ENSURE( xIfc.is(),
"Couldn't create a table" );
1195 xTable.set( xIfc, UNO_QUERY );
1200 xTable->initialize( 1, 1 );
1207 catch( IllegalArgumentException& )
1219 pXTable = comphelper::getFromUnoTunnel<SwXTextTable>(xTable);
1221 Reference < XCellRange > xCellRange( xTable, UNO_QUERY );
1222 Reference < XCell > xCell = xCellRange->getCellByPosition( 0, 0 );
1223 Reference < XText> xText( xCell, UNO_QUERY );
1234 OSL_ENSURE( pTableFrameFormat,
"table format missing" );
1236 OSL_ENSURE( pTable,
"table missing" );
1240 pTableFrameFormat->
SetName( sTableName );
1251 m_pTableNode( pTable->m_pTableNode ),
1253 m_bOwnsBox1(
false ),
1254 m_pSttNd1( nullptr ),
1255 m_pBoxFormat( nullptr ),
1256 m_pLineFormat( nullptr ),
1257 m_xParentTable( pTable ),
1258 m_bFirstSection(
false ),
1259 m_bRelWidth( true ),
1260 m_bHasSubTables(
false ),
1264 m_nNonMergedCurCol( 0 ),
1283 const Reference< xml::sax::XFastAttributeList > & xAttrList )
1285 bool bHeader =
false;
1291 return new SwXMLTableRowContext_Impl(
GetSwImport(), nElement, xAttrList,
this );
1297 return new SwXMLTableRowsContext_Impl(
GetSwImport(),
this, bHeader );
1307 return new SwXMLTableColsContext_Impl(
GetSwImport(),
this );
1312 return new SwXMLTableColContext_Impl(
GetSwImport(), xAttrList,
1328 const OUString *pDfltCellStyleName )
1331 "SwXMLTableContext::InsertColumn: no space left" );
1340 if( !((pDfltCellStyleName && !pDfltCellStyleName->isEmpty()) ||
1352 if(pDfltCellStyleName)
1359 sal_uInt32 nColSpan )
const
1361 sal_uInt32 nLast = nCol+nColSpan;
1365 sal_Int32 nWidth2 = 0;
1366 for( sal_uInt32
i=nCol;
i < nLast; ++
i )
1381 sal_uInt32 nRowSpan, sal_uInt32 nColSpan,
1385 const OUString* pFormula,
1388 OUString
const*
const pStringValue )
1391 "SwXMLTableContext::InsertCell: row is full" );
1393 "SwXMLTableContext::InsertCell: table is full" );
1397 OSL_ENSURE( nRowSpan >=1,
"SwXMLTableContext::InsertCell: row span is 0" );
1400 OSL_ENSURE( nColSpan >=1,
"SwXMLTableContext::InsertCell: col span is 0" );
1405 sal_uInt32 nColsReq =
m_nCurCol + nColSpan;
1431 sal_uInt32 nRowsReq =
m_nCurRow + nRowSpan;
1432 if( nRowsReq > USHRT_MAX )
1435 nRowsReq = USHRT_MAX;
1452 if (
m_pRows->size() < nRowsReq)
1454 for (
size_t i =
m_pRows->size();
i < nRowsReq; ++
i)
1455 m_pRows->push_back(std::make_unique<SwXMLTableRow_Impl>(
1459 OUString sStyleName( rStyleName );
1460 if( sStyleName.isEmpty() )
1462 sStyleName = (*m_pRows)[
m_nCurRow]->GetDefaultCellStyleName();
1466 if( sStyleName.isEmpty() )
1472 for( sal_uInt32
i=nColSpan;
i>0; --
i )
1474 for( sal_uInt32 j=nRowSpan; j>0; --j )
1476 const bool bCovered =
i != nColSpan || j != nRowSpan;
1479 throw css::lang::IndexOutOfBoundsException();
1480 pCell->
Set( sStyleName, j,
i, pStartNode,
1481 pTable, bProtect, pFormula, bHasValue, bCovered, fValue,
1506 const OUString& rDfltCellStyleName,
1510 "SwXMLTableContext::InsertRow: no space left" );
1518 if (m_nCurRow < m_pRows->
size())
1523 rStyleName, rDfltCellStyleName );
1528 m_pRows->push_back(std::make_unique<SwXMLTableRow_Impl>(
1530 &rDfltCellStyleName));
1586 sal_uInt32 nCol )
const
1597 pPrevCell =
GetCell( nRow, nCol-1 );
1615 OSL_ENSURE( pSttNd !=
nullptr,
1623 sal_uInt32 nColSpan )
1625 sal_uInt32 nLastCol = nCol + nColSpan;
1626 for( sal_uInt32
i = nCol;
i < nLastCol;
i++ )
1628 sal_uInt32 j = nRow;
1629 sal_uInt32 nRowSpan = 1;
1634 pCell = j > 0 ?
GetCell( --j,
i ) :
nullptr;
1645 sal_uInt32 nLastRow = bRows ? nRow + pCell->
GetRowSpan() : nRow + 1;
1646 sal_uInt32 nLastCol = nCol + pCell->
GetColSpan();
1648 for( sal_uInt32
i=nRow;
i<nLastRow;
i++ )
1651 for( sal_uInt32 j=nCol; j<nLastCol; j++ )
1686 const OUString& rStyleName,
1687 sal_Int32 nColumnWidth,
1691 bool* pModifyLocked )
1714 (*m_pSharedBoxFormats)[ aKey ] = pBoxFormat2;
1719 pBoxFormat2 = aIter->second;
1729 if ( pModifyLocked !=
nullptr )
1740 sal_uInt32 nLeftCol,
1741 sal_uInt32 nBottomRow,
1742 sal_uInt32 nRightCol )
1747 sal_uInt32 nColSpan = nRightCol - nLeftCol;
1759 bool bSplitted =
false;
1763 sal_uInt32 nStartRow = nTopRow;
1766 for( i = nTopRow; i < nBottomRow; i++ )
1771 for( sal_uInt32 j=nLeftCol; j<nRightCol; j++ )
1777 if( bSplit && (nStartRow>nTopRow || i+1<nBottomRow) )
1794 nStartRow = nTopRow;
1795 while( nStartRow < nBottomRow )
1797 sal_uInt32 nMaxRowSpan = 0;
1800 for( i=nLeftCol; i<nRightCol; i++ )
1802 pCell = pStartRow->
GetCell(i);
1807 nStartRow += nMaxRowSpan;
1808 if( nStartRow<nBottomRow )
1812 while( i < nRightCol )
1818 const sal_uInt32 nColSpan2 = pCell2->
GetColSpan();
1839 sal_uInt32 nLeftCol, sal_uInt32 nRightCol )
1843 sal_uInt32 nColSpan = nRightCol - nLeftCol;
1863 pBox, sStyleName, nColWidth, pCell->
IsProtected(),
1866 bNew, &bModifyLocked );
1875 XmlStyleFamily::TABLE_CELL, sStyleName, &pAutoItemSet ) )
1888 SAL_WARN_IF(!pTextNode,
"sw",
"Should have a text node in cell?");
1891 SAL_WARN_IF(!pTextNode->GetText().isEmpty(),
"sw",
1905 bool bSuppressNumericContent =
false;
1908 !sStyleName.isEmpty() )
1921 if( pTextNode !=
nullptr )
1924 const OUString& rText = pTextNode->
GetText();
1925 if( ( rText.getLength() > 10 ) ||
1926 ( rText.indexOf(
'0' ) == -1 ) )
1928 bSuppressNumericContent =
true;
1933 bSuppressNumericContent =
true;
1938 if( bSuppressNumericContent )
1949 const OUString& rFormula = pCell->
GetFormula();
1950 if (!rFormula.isEmpty())
1967 if( pNumFormat !=
nullptr && pNumberFormatter &&
1968 !pNumberFormatter->
GetEntry( pNumFormat->GetValue() )->IsTextFormat() )
1993 if (! bModifyLocked)
2003 sal_uInt32 nLeftCol,
2004 sal_uInt32 nBottomRow,
2005 sal_uInt32 nRightCol )
2009 if( !pUpper && 0
UL==nTopRow )
2025 const OUString& rStyleName = (*m_pRows)[nTopRow]->GetStyleName();
2026 if( 1 == (nBottomRow - nTopRow) &&
2027 !rStyleName.isEmpty() &&
2029 XmlStyleFamily::TABLE_ROW, rStyleName, &pAutoItemSet ) )
2037 sal_uInt32 nStartCol = nLeftCol;
2038 while( nStartCol < nRightCol )
2040 for( sal_uInt32 nRow=nTopRow; nRow<nBottomRow; nRow++ )
2041 (*
m_pRows)[nRow]->SetSplitable(
true );
2043 sal_uInt32 nCol = nStartCol;
2044 sal_uInt32 nSplitCol = nRightCol;
2045 bool bSplitted =
false;
2048 OSL_ENSURE( nCol < nRightCol,
"Ran too far" );
2054 bool bHoriSplitMayContinue =
false;
2055 bool bHoriSplitPossible =
false;
2060 for( sal_uInt32 nRow=nTopRow; nRow<nBottomRow; nRow++ )
2065 bool bHoriSplit = (*m_pRows)[nRow]->IsSplitable() &&
2066 nRow+1 < nBottomRow &&
2068 (*m_pRows)[nRow]->SetSplitable( bHoriSplit );
2075 bHoriSplitPossible |= bHoriSplit;
2079 bHoriSplit &= (nCol+1 < nRightCol &&
2081 bHoriSplitMayContinue |= bHoriSplit;
2091 if ( pCell ==
nullptr )
2093 OSL_FAIL(
"table seems to be corrupt." );
2102 #if OSL_DEBUG_LEVEL > 0
2103 if( nCol == nRightCol-1 )
2105 OSL_ENSURE( bSplit,
"Split-Flag wrong" );
2108 OSL_ENSURE( !bHoriSplitMayContinue,
2109 "HoriSplitMayContinue-Flag wrong" );
2111 OSL_ENSURE( pTmpCell->
GetRowSpan() != (nBottomRow-nTopRow) ||
2112 !bHoriSplitPossible,
"HoriSplitPossible-Flag wrong" );
2117 OSL_ENSURE( !
m_bHasSubTables || !bHoriSplitMayContinue || bHoriSplitPossible,
2118 "bHoriSplitMayContinue, but not bHoriSplitPossible" );
2130 sal_Int32 nBoxRowSpan = 1;
2136 nBoxRowSpan = -1 * nBoxRowSpan;
2143 nSplitCol = nCol + 1;
2145 pBox =
MakeTableBox( pLine, pCell, nStartCol, nSplitCol );
2147 if ( 1 != nBoxRowSpan )
2152 else if(
m_bHasSubTables && bHoriSplitPossible && bHoriSplitMayContinue )
2160 nSplitCol = nCol + 1;
2171 if( bHoriSplitPossible || nSplitCol > nCol+1 )
2173 OSL_ENSURE( !bHoriSplitMayContinue,
2174 "bHoriSplitMayContinue==true" );
2175 OSL_ENSURE( bHoriSplitPossible || nSplitCol == nRightCol,
2176 "bHoriSplitPossible flag should be set" );
2178 nSplitCol = nCol + 1;
2182 nBottomRow, nSplitCol );
2189 rBoxes.push_back( pBox );
2193 nStartCol = nSplitCol;
2202 std::vector<ColumnWidthInfo>::iterator colIter;
2231 sal_Int32 nAbsWidth = 0;
2232 sal_Int32 nMinAbsColWidth = 0;
2233 sal_Int32 nRelWidth = 0;
2234 sal_Int32 nMinRelColWidth = 0;
2235 sal_uInt32 nRelCols = 0;
2238 if( rCol.isRelative )
2240 nRelWidth += rCol.width;
2241 if( 0 == nMinRelColWidth || rCol.width < nMinRelColWidth )
2242 nMinRelColWidth = rCol.width;
2247 nAbsWidth += rCol.width;
2248 if( 0 == nMinAbsColWidth || rCol.width < nMinAbsColWidth )
2249 nMinAbsColWidth = rCol.width;
2252 sal_uInt32 nAbsCols = nCols - nRelCols;
2265 if( 0 == nMinRelColWidth )
2266 nMinRelColWidth = nMinAbsColWidth;
2268 for(
auto& rCol : m_aColumnWidths)
2270 if( !rCol.isRelative )
2272 if (nMinAbsColWidth == 0)
2275 if (o3tl::checked_multiply<sal_Int32>(rCol.width, nMinRelColWidth, nVal))
2276 throw std::overflow_error(
"overflow in multiply");
2277 sal_Int32 nRelCol = nVal / nMinAbsColWidth;
2278 rCol.width = nRelCol;
2279 rCol.isRelative =
true;
2280 nRelWidth += nRelCol;
2296 if( nRelWidth !=
m_nWidth && nRelWidth && nCols )
2298 double n =
static_cast<double>(
m_nWidth) / static_cast<double>(nRelWidth);
2300 for( colIter = m_aColumnWidths.begin(); colIter < m_aColumnWidths.end() - 1; ++colIter)
2302 sal_Int32 nW =
static_cast<sal_Int32
>( colIter->width * n);
2303 colIter->width = o3tl::narrowing<sal_uInt16>(nW);
2306 m_aColumnWidths.back().width = (
m_nWidth-nRelWidth);
2317 sal_Int32 nAbsForRelWidth =
2322 sal_Int32 nExtraRel = nRelWidth - (nRelCols * nMinRelColWidth);
2326 sal_Int32 nMinAbs = nRelCols *
MINLAY;
2327 sal_Int32 nExtraAbs =
2328 nAbsForRelWidth > nMinAbs ? nAbsForRelWidth - nMinAbs : sal_Int32(0L);
2331 bool bMinExtra =
false;
2334 if( nAbsForRelWidth <= nMinAbs )
2338 nAbsForRelWidth = nMinAbs;
2341 else if( nAbsForRelWidth <= (nRelWidth * MINLAY) /
2354 for(
auto& rCol : m_aColumnWidths )
2356 if( rCol.isRelative )
2363 nAbsCol = nAbsForRelWidth;
2371 else if( bMinExtra )
2373 sal_Int32 nExtraRelCol = rCol.width - nMinRelColWidth;
2374 nAbsCol = MINLAY + (nExtraRelCol * nExtraAbs) /
2379 nAbsCol = ( rCol.width * nAbsForRelWidth) / nRelWidth;
2382 rCol.width = nAbsCol;
2383 rCol.isRelative =
false;
2384 nAbsForRelWidth -= nAbsCol;
2385 nAbsWidth += nAbsCol;
2393 if( nCols && nAbsWidth )
2399 sal_Int32 nExtraAbs =
m_nWidth - nAbsWidth;
2400 sal_Int32 nAbsLastCol = m_aColumnWidths.back().width + nExtraAbs;
2401 for( colIter = m_aColumnWidths.begin(); colIter < m_aColumnWidths.end()-1; ++colIter )
2403 sal_Int32 nAbsCol = colIter->width;
2404 sal_Int32 nExtraAbsCol = (nAbsCol * nExtraAbs) /
2406 nAbsCol += nExtraAbsCol;
2407 colIter->width = nAbsCol;
2408 nAbsLastCol -= nExtraAbsCol;
2410 m_aColumnWidths.back().width = nAbsLastCol;
2418 sal_Int32 nAbsLastCol =
MINLAY + nExtraAbs;
2419 for( colIter = m_aColumnWidths.begin(); colIter < m_aColumnWidths.end()-1; ++colIter )
2421 sal_Int32 nAbsCol = colIter->width;
2422 sal_Int32 nExtraAbsCol = (nAbsCol * nExtraAbs) /
2424 nAbsCol =
MINLAY + nExtraAbsCol;
2425 colIter->width = nAbsCol;
2426 nAbsLastCol -= nExtraAbsCol;
2428 m_aColumnWidths.back().width = nAbsLastCol;
2437 sal_uInt32 nStartRow = 0;
2438 sal_uInt32 nRows =
m_pRows->size();
2439 for(sal_uInt32
i=0;
i<nRows; ++
i )
2446 for( sal_uInt32 j=0; j<nCols; j++ )
2458 if( pBox || nStartRow>0 )
2475 OSL_FAIL(
"invalid table: no cells; deleting...");
2488 sal_Int16 eHoriOrient = text::HoriOrientation::FULL;
2489 bool bSetHoriOrient =
false;
2493 OUString sStyleName;
2500 if( !m_aStyleName.isEmpty() &&
2502 XmlStyleFamily::TABLE_TABLE, m_aStyleName, &pAutoItemSet ) &&
2510 eHoriOrient = pItem->GetHoriOrient();
2511 switch( eHoriOrient )
2513 case text::HoriOrientation::FULL:
2517 bSetHoriOrient =
true;
2520 case text::HoriOrientation::LEFT:
2523 eHoriOrient = text::HoriOrientation::LEFT_AND_WIDTH;
2524 bSetHoriOrient =
true;
2533 bSetHoriOrient =
true;
2539 switch( eHoriOrient )
2541 case text::HoriOrientation::FULL:
2562 sal_Int32
const min =
static_cast<sal_Int32
>(
2577 eHoriOrient = text::HoriOrientation::LEFT_AND_WIDTH == eHoriOrient
2579 bSetHoriOrient =
true;
2589 bSetHoriOrient =
true;
2604 if( bSetHoriOrient )
2615 for (std::unique_ptr<SwXMLTableRow_Impl> & rRow : *
m_pRows)
2631 pFieldType,
false ) );
2656 for (std::unique_ptr<SwXMLTableRow_Impl> & rpRow : *
m_pRows)
2665 OUString
const*
const pStringValueStyleName)
2674 Reference<XUnoTunnel> xCursorTunnel(
GetImport().GetTextImport()->GetCursor(),
2676 OSL_ENSURE( xCursorTunnel.is(),
"missing XUnoTunnel for Cursor" );
2677 OTextCursorHelper *pTextCursor = comphelper::getFromUnoTunnel<OTextCursorHelper>(xCursorTunnel);
2678 OSL_ENSURE( pTextCursor,
"SwXTextCursor missing" );
2686 GetImport().GetTextImport()->GetCursor(),
"Standard",
true );
2694 OSL_ENSURE( pDoc,
"<SwXMLTableContext::InsertTableSection(..)> - no <pDoc> at <SwXTextCursor> instance - <SwXTextCurosr> doesn't seem to be registered at a <SwUnoCursor> instance." );
2706 if( !pPrevSttNd &&
m_pBox1 !=
nullptr )
2715 const uno::Reference< text::XTextRange > xTextRange =
2717 Reference < XText > xText = xTextRange->getText();
2718 Reference < XTextCursor > xTextCursor =
2719 xText->createTextCursorByRange( xTextRange );
2724 if (pStringValueStyleName)
2727 GetImport().GetTextImport()->GetCursor(), *pStringValueStyleName,
2728 true,
false, -1,
false);
SwTableNode * m_pTableNode
const SwEndNode * EndOfSectionNode() const
Starts a section of nodes in the document model.
SwNodeOffset min(const SwNodeOffset &a, const SwNodeOffset &b)
constexpr TypedWhichId< SvxProtectItem > RES_PROTECT(100)
tools::Long GetWidth() const
SwNodeOffset EndOfSectionIndex() const
void SetRowsToRepeat(sal_uInt16 nNumOfRows)
Represents the style of a paragraph.
const T * GetItemIfSet(TypedWhichId< T > nWhich, bool bSrchInParent=true) const
Marks a position in the document model.
std::unique_ptr< SwXMLTableRows_Impl > m_pRows
void Expand(sal_uInt32 nCells, bool bOneCell)
bool FindAutomaticStyle(XmlStyleFamily nFamily, const OUString &rName, const SfxItemSet **ppItemSet) const
SvXMLImportContextRef m_xSubTable
sal_uInt32 GetColumnCount() const
void DelFrames(SwRootFrame const *pLayout=nullptr)
Method deletes all views of document for the node.
constexpr TypedWhichId< SwTableBoxNumFormat > RES_BOXATR_FORMAT(RES_BOXATR_BEGIN)
const OUString & GetText() const
SvNumberFormatter * GetNumberFormatter(bool bCreate=true)
static void FillUIName(const OUString &rName, OUString &rFillName, SwGetPoolIdFromName)
void InsertRow(const OUString &rStyleName, const OUString &rDfltCellStyleName, bool bInHead)
SwNodeOffset StartOfSectionIndex() const
virtual SwFieldType * GetFieldType(SwFieldIds nResId, const OUString &rName, bool bDbFieldMatching) const =0
constexpr TypedWhichId< SwFormatFrameSize > RES_FRM_SIZE(89)
const SwStartNode * m_pSttNd1
sal_uInt32 GetRowSpan() const
const SwStartNode * InsertTableSection(const SwStartNode *pPrevSttNd=nullptr, OUString const *pStringValueStyleName=nullptr)
void SetStartNode(const SwStartNode *pSttNd)
const OUString & GetStyleName() const
OUString GetUniqueTableName() const
SwTableLine * MakeTableLine(SwTableBox *pUpper, sal_uInt32 nTopRow, sal_uInt32 nLeftCol, sal_uInt32 nBottomRow, sal_uInt32 nRightCol)
OUString GetColumnDefaultCellStyleName(sal_uInt32 nCol) const
const SwPosition * GetMark() const
const sal_Unicode cTokenSeparator
SwTableBoxFormat * m_pBoxFormat
SvXMLImport & GetImport()
sal_Int32 toInt32(OUString const &rStr)
SfxLinkUpdateMode GetType() const
SwTableFormat * FindTableFormatByName(const OUString &rName, bool bAll=false) const
SwFrameFormat * ClaimFrameFormat()
void MakeTable(SwTableBox *pBox, sal_Int32 nWidth)
void push_back(SwTableLine *pLine)
SwTableLine is one table row in the document model.
SwTableBox * NewTableBox(const SwStartNode *pStNd, SwTableLine *pUpper)
OUString m_aDfltCellStyleName
bool IsXMLToken(std::u16string_view rString, enum XMLTokenEnum eToken)
FastAttributeList & castToFastAttributeList(const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
const OUString & GetFormula() const
rtl::Reference< XMLTextImportHelper > const & GetTextImport()
constexpr TypedWhichId< SwTableBoxValue > RES_BOXATR_VALUE(152)
IDocumentContentOperations const & getIDocumentContentOperations() const
rtl::Reference< SwXMLDDETableContext_Impl > m_xDDESource
SwTableFormat * GetFrameFormat()
bool m_bIsAutomaticUpdate
void SetStyleName(const OUString &rStyleName)
static void convertDouble(OUStringBuffer &rBuffer, double fNumber, bool bWriteUnits, sal_Int16 nSourceUnit, sal_Int16 nTargetUnit)
OUString const & GetCmd() const
IDocumentFieldsAccess const & getIDocumentFieldsAccess() const
const SwXMLTableCell_Impl * GetCell(sal_uInt32 nRow, sal_uInt32 nCol) const
void Set(const OUString &rStyleName, const OUString &rDfltCellStyleName)
OUString const * GetStringValue() const
constexpr TypedWhichId< SwFormatHoriOrient > RES_HORI_ORIENT(103)
IDocumentStylePoolAccess const & getIDocumentStylePoolAccess() const
check if target position is in fly anchored at source range
void SetTableModel(bool bNew)
#define XMLOFF_WARN_UNKNOWN(area, rIter)
SwXMLTableContext * GetParentTable() const
OUString m_aDefaultCellStyleName
css::uno::Reference< css::text::XTextCursor > m_xOldCursor
const SwTable & GetTable() const
virtual void DeleteSection(SwNode *pNode)=0
Delete section containing the node.
static OUString getPrefixAndNameFromToken(sal_Int32 nToken)
void SetSplitable(bool bSet)
void InsertCoveredCell(const OUString &rStyleName)
Sets formatting of an already created covered cell.
const SwStartNode * GetPrevStartNode(sal_uInt32 nRow, sal_uInt32 nCol) const
const IDocumentFieldsAccess & getIDocumentFieldsAccess() const
Provides access to the document fields administration interface.
const SwStartNode * m_pStartNode
const SwStartNode * m_pStartNode
SwXMLTableContext * GetSubTable() const
SwStartNode * MakeTextSection(const SwNodeIndex &rWhere, SwStartNodeType eSttNdTyp, SwTextFormatColl *pColl)
SvXMLImportContextRef m_xParentTable
PaM is Point and Mark: a selection of the document model.
static SwTable * FindTable(SwFrameFormat const *const pFormat)
void ReplaceWithEmptyCell(sal_uInt32 nRow, sal_uInt32 nCol, bool bRows)
void InsertRepRows(sal_uInt32 nCount)
css::uno::Reference< css::text::XTextContent > m_xTextContent
SwXMLTableContext(SwXMLImport &rImport, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
if set, call pBox->LockModify() and return old lock status
OUString & GetDDEApplication()
const SwPosition * GetPoint() const
virtual bool CopyRange(SwPaM &rPam, SwPosition &rPos, SwCopyFlags flags) const =0
Copy a selected content range to a position.
SwIndex & Assign(SwIndexReg *, sal_Int32)
void InsertColumn(sal_Int32 nWidth, bool bRelWidth, const OUString *pDfltCellStyleName=nullptr)
bool IsInsertRowPossible() const
bool HasStringValue() const
void MakeTable_(SwTableBox *pBox=nullptr)
SwNodeOffset GetIndex() const
sal_uInt32 m_nNonMergedCurCol
Same as m_nCurCol, but not incremented multiple times for table cells with row span.
Marks a character position inside a document model node.
bool IsInsertColPossible() const
OUString & GetConnectionName()
virtual ~SwXMLTableContext() override
const OUString & GetStyleName() const
SwXMLImport & GetSwImport()
SwFrameFormat * GetFrameFormat()
SwXMLTableCell_Impl(sal_uInt32 nRSpan=1, sal_uInt32 nCSpan=1)
bool operator==(const TableBoxIndex &rArg) const
void MakeOwnFrames(SwNodeIndex *pIdxBehind)
Creates the frms for the table node (i.e. the TabFrames).
static void convertDuration(OUStringBuffer &rBuffer, const double fTime)
Marks a node in the document model.
SwFrameFormat * GetFrameFormat()
#define SV_COUNTRY_LANGUAGE_OFFSET
std::vector< std::unique_ptr< SwXMLTableCell_Impl > > m_Cells
std::unique_ptr< map_BoxFormat > m_pSharedBoxFormats
SwTableLines & GetTabLines()
IDocumentLayoutAccess const & getIDocumentLayoutAccess() const
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override
SwTable is one table in the document model, containing rows (which contain cells).
SwTableLines & GetTabLines()
static bool convertBool(bool &rBool, std::u16string_view rString)
void SetXmlId(css::uno::Reference< css::uno::XInterface > const &i_xIfc, OUString const &i_rXmlId)
SwTableBoxFormat * GetSharedBoxFormat(SwTableBox *pBox, const OUString &rStyleName, sal_Int32 nColumnWidth, bool bProtected, bool bMayShare, bool &bNew, bool *pModifyLocked)
sets the appropriate SwTableBoxFormat at pBox.
bool IsModifyLocked() const
SwTextNode is a paragraph in the document model.
void Set(const OUString &rStyleName, sal_uInt32 nRSpan, sal_uInt32 nCSpan, const SwStartNode *pStNd, SwXMLTableContext *pTable, bool bProtect, const OUString *pFormula, bool bHasValue, bool bCovered, double dVal, OUString const *const pStringValue)
SwTableBoxes & GetTabBoxes()
void FixRowSpan(sal_uInt32 nRow, sal_uInt32 nCol, sal_uInt32 nColSpan)
std::vector< SwTableBox * > SwTableBoxes
const SwStartNode * GetSttNd() const
void ChgFrameFormat(SwTableBoxFormat *pNewFormat, bool bNeedToReregister=true)
const SwStartNode * GetLastStartNode() const
#define SAL_WARN_IF(condition, area, stream)
virtual const SwViewShell * GetCurrentViewShell() const =0
Returns the layout set at the document.
virtual SwFieldType * InsertFieldType(const SwFieldType &)=0
sal_Int32 GetColumnWidth(sal_uInt32 nCol, sal_uInt32 nColSpan) const
std::vector< ColumnWidthInfo > m_aColumnWidths
static OUString lcl_GenerateFieldTypeName(const OUString &sPrefix, SwTableNode *pTableNode)
virtual void SAL_CALL endFastElement(sal_Int32 Element) override
void SetTableStyleName(const OUString &rName)
Set the new table style name for this table.
#define SAL_INFO(area, stream)
virtual css::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
static constexpr sal_Int32 MAX_WIDTH
virtual SwTextFormatColl * GetTextCollFromPool(sal_uInt16 nId, bool bRegardLanguage=true)=0
Return "Auto-Collection with ID.
constexpr TypedWhichId< SwTableBoxFormula > RES_BOXATR_FORMULA(151)
sal_uInt32 GetColSpan() const
#define XML_ELEMENT(prefix, name)
virtual void SAL_CALL startFastElement(sal_Int32 nElement, const Reference< xml::sax::XFastAttributeList > &xAttrList) override
SwTableBox is one table cell in the document model.
std::vector< std::unique_ptr< SwXMLTableRow_Impl > > SwXMLTableRows_Impl
SwTableBox * MakeTableBox(SwTableLine *pUpper, const SwXMLTableCell_Impl *pStartNode, sal_uInt32 nLeftCol, sal_uInt32 nRightCol)
constexpr TypedWhichId< SvxLRSpaceItem > RES_LR_SPACE(91)
o3tl::strong_int< sal_Int32, struct Tag_SwNodeOffset > SwNodeOffset
static SwDDEFieldType * lcl_GetDDEFieldType(SwXMLDDETableContext_Impl *pContext, SwTableNode *pTableNode)
SwXMLTableRow_Impl(const OUString &rStyleName, sal_uInt32 nCells, const OUString *pDfltCellStyleName=nullptr)
SwFrameFormat * ClaimFrameFormat()
std::unordered_map< TableBoxIndex, SwTableBoxFormat *, TableBoxIndexHasher > map_BoxFormat
const SwStartNode * FindTableBoxStartNode() const
OUString m_sDDEApplication
void SetUpper(SwTableLine *pNew)
OUString m_sConnectionName
TableBoxIndex(const OUString &rName, sal_Int32 nWidth, bool bProtected)
#define SAL_WARN(area, stream)
Reference< XSingleServiceFactory > xFactory
#define XMLOFF_WARN_UNKNOWN_ELEMENT(area, token)
std::optional< std::vector< OUString > > m_xColumnDefaultCellStyleNames
void setRowSpan(sal_Int32 nNewRowSpan)
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
void SetContentProtect(bool bNew)
Ends a section of nodes in the document model.
bool GetIsAutomaticUpdate() const
SwXMLTableCell_Impl * GetCell(sal_uInt32 nCol)
Frame is variable in Var-direction.
void SetNewTable(std::unique_ptr< SwTable >, bool bNewFrames=true)
SwDoc * GetDocFromXMLImport(SvXMLImport const &)
const SwStartNode * GetStartNode() const
SwTableLineFormat * m_pLineFormat
const OUString & GetDefaultCellStyleName() const
constexpr sal_uInt16 XML_NAMESPACE_OOOW
void InsertCell(const OUString &rStyleName, sal_uInt32 nRowSpan, sal_uInt32 nColSpan, const SwStartNode *pStNd, SwXMLTableContext *pTable=nullptr, bool bIsProtected=false, const OUString *pFormula=nullptr, bool bHasValue=false, double fValue=0.0, OUString const *const pStringValue=nullptr)
SwXMLDDETableContext_Impl(SwXMLImport &rImport)
void SetRowSpan(sal_uInt32 nSet)
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
OUString toString(OptionInfo const *info)
bool m_bDetectedRangeSegmentation false
SwTableNode * GetTableNode() const
size_t operator()(const TableBoxIndex &rArg) const
SW_DLLPUBLIC SwFrameFormat * GetFrameFormat()