22 #include <string_view>
24 #include <com/sun/star/text/XTextTable.hpp>
25 #include <com/sun/star/text/XTextSection.hpp>
28 #include <rtl/ustrbuf.hxx>
90 struct SwXMLTableColumnCmpWidth_Impl
101 class SwXMLTableColumns_Impl :
public o3tl::sorted_vector<std::unique_ptr<SwXMLTableColumn_Impl>, o3tl::less_uniqueptr_to<SwXMLTableColumn_Impl> > {
128 #if OSL_DEBUG_LEVEL > 0
129 sal_uInt32 nEndCPos = 0U;
131 const size_t nLines = rLines.
size();
132 for(
size_t nLine=0U; nLine<nLines; ++nLine )
136 const size_t nBoxes = rBoxes.size();
138 sal_uInt32 nCPos = 0U;
139 for(
size_t nBox=0U; nBox<nBoxes; ++nBox )
143 if( nBox < nBoxes-1U ||
nWidth==0 )
146 std::unique_ptr<SwXMLTableColumn_Impl> pCol(
149 aCols.insert( std::move(pCol) );
151 if( nBox==nBoxes-1U )
153 OSL_ENSURE( nLine==0U &&
nWidth==0,
154 "parent width will be lost" );
160 #if OSL_DEBUG_LEVEL > 0
161 sal_uInt32 nCheckPos =
165 nEndCPos = nCheckPos;
169 #if OSL_DEBUG_LEVEL > 0
171 OSL_ENSURE(
aCols.find(&aCol) !=
aCols.end(),
"couldn't find last column" );
174 "rows have different total widths" );
188 bool AddRow(
SwFrameFormat& rFrameFormat, std::u16string_view rNamePrefix, sal_uInt32 nLine );
190 sal_uInt32 nCol, sal_uInt32 nRow,
bool bTop );
194 std::u16string_view rNamePrefix,
204 pFrameSize = static_cast<const SwFormatFrameSize *>(pItem);
207 pRowSplit = static_cast<const SwFormatRowSplit *>(pItem);
210 pBrush = static_cast<const SvxBrushItem *>(pItem);
213 if( !pFrameSize && !pBrush && !pRowSplit )
218 SwXMLFrameFormats_Impl::iterator
i;
273 if( pBrush && (*pBrush != *pTestBrush) )
287 rFrameFormat.
SetName( OUString::Concat(rNamePrefix) +
"." + OUString::number(nLine+1) );
296 sal_uInt32 nCol, sal_uInt32 nRow,
bool bTop )
302 return OUString::Concat(rNamePrefix) +
"." + sTmp + OUString::number(nRow + 1);
304 return OUString::Concat(rNamePrefix)
305 +
"." + OUString::number(nCol + 1)
306 +
"." + OUString::number(nRow + 1);
310 std::u16string_view rNamePrefix,
311 sal_uInt32 nCol, sal_uInt32 nRow,
bool bTop )
324 pVertOrient = static_cast<const SwFormatVertOrient *>(pItem);
327 pBrush = static_cast<const SvxBrushItem *>(pItem);
330 pBox = static_cast<const SvxBoxItem *>(pItem);
334 pNumFormat = static_cast<const SwTableBoxNumFormat *>(pItem);
337 pFrameDir = static_cast<const SvxFrameDirectionItem *>(pItem);
340 pAttCnt = static_cast<const SvXMLAttrContainerItem *>(pItem);
343 if( !pVertOrient && !pBrush && !pBox && !pNumFormat && !pFrameDir && !pAttCnt )
353 SwXMLFrameFormats_Impl::iterator
i;
397 pTestBox =
static_cast<const SvxBoxItem *
>(pItem);
454 if( pBrush && ( *pBrush != *pTestBrush ) )
457 if( pBox && ( *pBox != *pTestBox ) )
463 if( pFrameDir && pFrameDir->GetValue() != pTestFrameDir->GetValue() )
466 if( pAttCnt && ( *pAttCnt != *pTestAttCnt ) )
501 inline void SetBaseSection(
const Reference < XTextSection >& rBase );
508 m_bBaseSectionValid(false),
514 const Reference < XTextSection >& rBaseSection )
526 bool bEncoded =
false;
538 OUStringBuffer sValue;
544 sValue.makeStringAndClear() );
548 sValue.append( static_cast<sal_Int32>(rCol.
GetRelWidth()) );
549 sValue.append(
'*' );
551 sValue.makeStringAndClear() );
563 sal_uInt32 nAbsWidth, sal_uInt32 nBaseWidth,
564 std::u16string_view rNamePrefix,
580 const SwXMLTableColumns_Impl& rCols = pLines->
GetColumns();
581 sal_uInt32 nCPos = 0U;
582 const size_t nColumns = rCols.size();
583 for(
size_t nColumn=0U; nColumn<nColumns; ++nColumn )
587 sal_uInt32 nOldCPos = nCPos;
588 nCPos = pColumn->
GetPos();
590 sal_uInt32 nWidth = nCPos - nOldCPos;
606 sal_uInt32 nColAbsWidth = nWidth;
609 nColAbsWidth *= nAbsWidth;
610 nColAbsWidth += (nBaseWidth/2UL);
611 nColAbsWidth /= nBaseWidth;
617 if( it != rExpCols.
end() )
627 pColumn->
SetStyleName( OUString::Concat(rNamePrefix) +
"." + sTmp );
632 OUString::Concat(rNamePrefix) +
"." + OUString::number(nColumn + 1U) );
635 rExpCols.
insert( pColumn );
641 const size_t nLines = rLines.
size();
642 for(
size_t nLine=0U; nLine<nLines; ++nLine )
647 if( rExpRows.
AddRow( *pFrameFormat, rNamePrefix, nLine ) )
651 const size_t nBoxes = rBoxes.size();
653 sal_uInt32 nCPos = 0U;
655 for(
size_t nBox=0U; nBox<nBoxes; nBox++ )
659 if( nBox < nBoxes-1U )
665 const size_t nOldCol = nCol;
667 SwXMLTableColumns_Impl::const_iterator it = pLines->
GetColumns().find( &aCol );
668 OSL_ENSURE( it != pLines->
GetColumns().end(),
"couldn't find column" );
675 if( rExpCells.
AddCell( *pFrameFormat2, rNamePrefix, nOldCol, nLine,
682 const_cast<SwTable *>(rTableInfo.
GetTable()) );
685 Reference < XText > xText( xCell, UNO_QUERY );
690 Any aAny = xCellPropertySet->getPropertyValue(
"TextSection");
691 Reference < XTextSection > xTextSection;
692 aAny >>= xTextSection;
696 const bool bExportContent = bool(
getExportFlags() & SvXMLExportFlags::CONTENT );
697 if ( !bExportContent )
705 OSL_FAIL(
"here should be a XCell");
711 nAbsWidth, nBaseWidth,
713 nOldCol, nLine, bTop ),
714 rExpCols, rExpRows, rExpCells,
735 sal_uInt32 nBaseWidth = 0;
739 || HoriOrientation::FULL == eTabHoriOri;
742 nBaseWidth = nAbsWidth;
756 pTableFormat->
GetName(), aExpCols, aExpRows, aExpCells,
773 if( !sName.isEmpty() )
783 OUString::number(nRowSpan) );
789 OUString::number(nColSpan) );
798 const_cast<SwTableBox *>(&rBox),
803 Reference<XText> xText( xCell, UNO_QUERY );
806 const OUString sCellFormula = xCell->getFormula();
810 if (!sCellFormula.isEmpty())
812 const OUString sQValue =
822 if (xCellPropertySet.is())
824 sal_Int32 nNumberFormat = 0;
825 Any aAny = xCellPropertySet->getPropertyValue(
"NumberFormat");
826 aAny >>= nNumberFormat;
834 else if ( (-1 != nNumberFormat) && !xText->getString().isEmpty() )
840 *
this, nNumberFormat, xCell->getValue() );
845 aAny = xCellPropertySet->getPropertyValue(
"IsProtected");
846 if (*o3tl::doAccess<bool>(aAny))
854 aAny = xCellPropertySet->getPropertyValue(
"TextSection");
855 Reference < XTextSection > xTextSection;
856 aAny >>= xTextSection;
872 OSL_FAIL(
"here should be a XCell");
906 if( !sName.isEmpty() )
915 const size_t nBoxes = rBoxes.size();
917 sal_uInt32 nCPos = 0U;
919 for(
size_t nBox=0U; nBox<nBoxes; ++nBox )
924 const sal_Int32 nRowSpan = pBox->
getRowSpan();
932 if( nBox < nBoxes-1U )
938 const size_t nOldCol = nCol;
940 SwXMLTableColumns_Impl::const_iterator it = rLines.
GetColumns().find( &aCol );
941 OSL_ENSURE( it != rLines.
GetColumns().end(),
"couldn't find column" );
945 if ( nCol < nOldCol )
947 OSL_FAIL(
"table and/or table information seems to be corrupted." );
953 const sal_uInt32 nColSpan = nCol - nOldCol + 1U;
956 ExportTableBox( *pBox, nColSpan, static_cast< sal_uInt32 >(nRowSpan), rTableInfo );
958 for(
size_t i=nOldCol;
i<nCol; ++
i )
972 sal_uInt32 nHeaderRows )
975 "SwXMLExport::ExportTableLines: table columns infos missing" );
981 for( nInfoPos=0; nInfoPos <
m_pTableLines->size(); nInfoPos++ )
990 "SwXMLExport::ExportTableLines: table columns info missing" );
991 OSL_ENSURE( 0==nInfoPos,
992 "SwXMLExport::ExportTableLines: table columns infos are unsorted" );
996 SwXMLTableLinesCache_Impl::iterator it =
m_pTableLines->begin();
997 advance( it, nInfoPos );
1004 const SwXMLTableColumns_Impl& rCols = pLines->
GetColumns();
1005 size_t nColumn = 0U;
1006 const size_t nColumns = rCols.size();
1007 sal_Int32 nColRep = 1;
1013 (nColumn < nColumns) ? rCols[nColumn].
get() :
nullptr;
1027 OUString::number(nColRep) );
1036 pColumn = pNextColumn;
1040 const size_t nLines = rLines.
size();
1042 if( nHeaderRows > 0 )
1047 OSL_ENSURE( nHeaderRows <= nLines,
"more headers then lines?" );
1048 for(
size_t nLine = 0U; nLine < nHeaderRows; ++nLine )
1052 for(
size_t nLine = nHeaderRows; nLine < nLines; ++nLine )
1072 if( pFrameFormat && !pFrameFormat->
GetName().isEmpty() )
1073 pFrameFormat->
SetName( OUString() );
1107 if (pTableFormat && !pTableFormat->
GetName().isEmpty())
1117 OUString sStyleName;
1125 if (
auto pSwDdeTable = dynamic_cast<const SwDDETable*>( &rTable) )
1128 const SwDDEFieldType* pDDEFieldType = pSwDdeTable->GetDDEFieldType();
1135 const OUString& sCmd = pDDEFieldType->
GetCmd();
1136 sal_Int32 nIdx{ 0 };
1145 if (pDDEFieldType->
GetType() == SfxLinkUpdateMode::ALWAYS)
1159 for(
SwTableLine *pLine : const_cast<SwTable &>(rTable).GetTabLines() )
1171 const Reference < XTextContent > & rTextContent,
1172 bool bAutoStyles,
bool _bProgress )
1177 Reference < XTextTable > xTextTable( rTextContent, UNO_QUERY );
1178 OSL_ENSURE( xTextTable.is(),
"text table missing" );
1179 if( xTextTable.is() )
1182 Reference<XUnoTunnel> xTableTunnel( rTextContent, UNO_QUERY);
1183 if( xTableTunnel.is() )
1187 OSL_ENSURE( pXTable,
"SwXTextTable missing" );
1192 OSL_ENSURE( pFormat,
"table format missing" );
1194 OSL_ENSURE( pTable,
"table missing" );
1196 OSL_ENSURE( pTableNd,
"table node missing" );
1205 const bool bExportStyles = bool(
GetExport().getExportFlags() & SvXMLExportFlags::STYLES );
1212 for (
const OUString& rCellName : aCellNames)
1214 css::uno::Reference<css::container::XEnumerationAccess> xCell(
1218 auto xEnumeration = xCell->createEnumeration();
1219 while (xEnumeration->hasMoreElements())
1221 if (css::uno::Reference<css::text::XTextTable> xInnerTable{
1222 xEnumeration->nextElement(), css::uno::UNO_QUERY })
1223 exportTable(xInnerTable, bAutoStyles, _bProgress);
1244 m_pTableLines->clear();
1245 m_pTableLines.reset();
Starts a section of nodes in the document model.
constexpr TypedWhichId< SvxFrameDirectionItem > RES_FRAMEDIR(120)
constexpr TypedWhichId< SvXMLAttrContainerItem > RES_UNKNOWNATR_CONTAINER(RES_UNKNOWNATR_BEGIN)
constexpr sal_uInt16 XML_NAMESPACE_OFFICE
void ExportTableAutoStyles(const SwTableNode &rTableNd)
constexpr TypedWhichId< SwTableBoxNumFormat > RES_BOXATR_FORMAT(RES_BOXATR_BEGIN)
static rtl::Reference< SwXCell > CreateXCell(SwFrameFormat *pTableFormat, SwTableBox *pBox, SwTable *pTable=nullptr)
constexpr TypedWhichId< SwFormatFrameSize > RES_FRM_SIZE(89)
rtl::Reference< XMLTextParagraphExport > const & GetTextParagraphExport()
bool isAutoStylesCollected() const
std::vector< SwXMLTableLines_Impl * > SwXMLTableLinesCache_Impl
const sal_Unicode cTokenSeparator
const Reference< XTextSection > & GetBaseSection() const
SfxLinkUpdateMode GetType() const
sal_uInt32 GetRelWidth() const
void SetRelWidth(sal_uInt32 nSet)
Reference< XTextSection > m_xBaseSection
SwXMLTableColumn_Impl(sal_uInt32 nPosition)
static sal_uInt32 GetBoxWidth(const SwTableBox *pBox)
const_iterator find(const Value &x) const
SwTableLine is one table row in the document model.
constexpr sal_uInt16 XML_NAMESPACE_LO_EXT
sal_uInt16 GetRowsToRepeat() const
static OUString lcl_xmltble_appendBoxPrefix(std::u16string_view rNamePrefix, sal_uInt32 nCol, sal_uInt32 nRow, bool bTop)
XML_TABLE_COLUMN_PROPERTIES
const SwTable * GetTable() const
SwTableFormat * GetFrameFormat()
bool IsInHeaderFooter(const SwNodeIndex &rIdx) const
sal_uInt32 GetWidthOpt() const
SvXMLExport & GetExport()
sal_Int32 getRowSpan() const
OUString const & GetCmd() const
constexpr TypedWhichId< SwFormatVertOrient > RES_VERT_ORIENT(102)
void sw_GetTableBoxColStr(sal_uInt16 nCol, OUString &rNm)
XML_NUMBER_COLUMNS_REPEATED
static bool isTextBox(const SwFrameFormat *pFormat, sal_uInt16 nType)
Is the frame format a text box?
void AddAttribute(sal_uInt16 nPrefix, const char *pName, const OUString &rValue)
virtual void exportTableAutoStyles() override
void ExportTableLinesAutoStyles(const SwTableLines &rLines, sal_uInt32 nAbsWidth, sal_uInt32 nBaseWidth, std::u16string_view rNamePrefix, SwXMLTableColumnsSortByWidth_Impl &rExpCols, SwXMLTableFrameFormatsSort_Impl &rExpRows, SwXMLTableFrameFormatsSort_Impl &rExpCells, SwXMLTableInfo_Impl &rTableInfo, bool bTop=false)
void Width(tools::Long nNew)
const SwTable & GetTable() const
const OUString & GetTableStyleName() const
Return the table style name of this table.
XML_NUMBER_COLUMNS_SPANNED
void SetWidthOpt(sal_uInt32 nWidth, bool bRel)
constexpr TypedWhichId< SwFormatRowSplit > RES_ROW_SPLIT(122)
void ExportFormat(const SwFormat &rFormat, enum::xmloff::token::XMLTokenEnum eClass)
SvtSaveOptions::ODFSaneDefaultVersion getSaneDefaultVersion() const
bool IsBaseSectionValid() const
virtual css::uno::Sequence< OUString > SAL_CALL getCellNames() override
static SwTable * FindTable(SwFrameFormat const *const pFormat)
bool IsShowProgress() const
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
static void lcl_xmltble_ClearName_Line(SwTableLine *pLine)
constexpr sal_uInt16 XML_NAMESPACE_TEXT
std::vector< const SwTableNode * > maTableNodes
const SwFrameFormat * GetTableFormat() const
SwXMLTableLines_Impl(const SwTableLines &rLines)
vector< SwFrameFormat * > SwXMLFrameFormats_Impl
void ExportTableColumnStyle(const SwXMLTableColumn_Impl &rCol)
tools::Long Width() const
bool hasSoftPageBreak() const
const SvXMLUnitConverter & GetTwipUnitConverter() const
SwXMLTableInfo_Impl(const SwTable *pTable, sal_uInt16 nPrefix)
SwFrameFormat * GetFrameFormat()
Marks a node in the document model.
SwFrameFormat * GetFrameFormat()
void ExportTableLines(const SwTableLines &rLines, SwXMLTableInfo_Impl &rTableInfo, sal_uInt32 nHeaderRows=0)
void ExportTableFormat(const SwFrameFormat &rFormat, sal_uInt32 nAbsWidth)
const_iterator end() const
OUString GetQNameByKey(sal_uInt16 nKey, const OUString &rLocalName, bool bCache=true) const
tools::Long GetHeight() const
void SetBaseSection(const Reference< XTextSection > &rBase)
const SwTableLines * GetLines() const
virtual void exportTable(const css::uno::Reference< css::text::XTextContent > &rTextContent, bool bAutoStyles, bool bProgress) override
SwTableLines & GetTabLines()
const SvXMLNamespaceMap & GetNamespaceMap() const
SwTable is one table in the document model, containing rows (which contain cells).
const SwXMLTableColumns_Impl & GetColumns() const
SwTableLines & GetTabLines()
sal_uInt16 GetPrefix() const
The namespace (table or loext) that should be used for the elements.
OUString EncodeStyleName(const OUString &rName, bool *pEncoded=nullptr) const
SwTableBoxes & GetTabBoxes()
void ExportTable(const SwTableNode &rTableNd)
void ExportTableLine(const SwTableLine &rLine, const SwXMLTableLines_Impl &rLines, SwXMLTableInfo_Impl &rTableInfo)
std::vector< SwTableBox * > SwTableBoxes
const SwStartNode * GetSttNd() const
constexpr sal_uInt16 XML_NAMESPACE_TABLE
constexpr TypedWhichId< SvxBrushItem > RES_BACKGROUND(105)
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
const SwTableLines * pLines
static void FillProgName(const OUString &rName, OUString &rFillName, SwGetPoolIdFromName)
SwTableBox is one table cell in the document model.
const OUString & GetStyleName() const
constexpr TypedWhichId< SvxBoxItem > RES_BOX(106)
SwXMLTableColumns_Impl aCols
constexpr TypedWhichId< SwFlyFrameFormat > RES_FLYFRMFMT(154)
sal_uInt32 GetWidth() const
sal_uInt32 GetValue() const
static void lcl_xmltble_ClearName_Box(SwTableBox *pBox)
void ExportTableBox(const SwTableBox &rBox, sal_uInt32 nColSpan, sal_uInt32 nRowSpan, SwXMLTableInfo_Impl &rTableInfo)
std::pair< const_iterator, bool > insert(Value &&x)
void SetStyleName(const OUString &rName)
constexpr sal_uInt16 XML_NAMESPACE_OOOW
virtual OUString GetName() const override
Only in derived classes.
static SW_DLLPUBLIC const css::uno::Sequence< sal_Int8 > & getUnoTunnelId()
SvXMLExportFlags getExportFlags() const
SwFrameFormat * GetFlyFormat() const
If node is in a fly return the respective format.
void convertMeasureToXML(OUStringBuffer &rBuffer, sal_Int32 nMeasure) const
constexpr sal_uInt32 getSwDefaultTextFormat()
The number formatter's default locale's @ Text format.
constexpr sal_uInt16 XML_NAMESPACE_STYLE
const Size & GetSize() const
virtual css::uno::Reference< css::table::XCell > SAL_CALL getCellByName(const OUString &aCellName) override
std::vector< SwXMLTableColumn_Impl * >::const_iterator const_iterator
sal_uInt32 GetPos() const
std::unique_ptr< SwXMLTableLinesCache_Impl > m_pTableLines
SwTableNode * GetTableNode() const
SW_DLLPUBLIC SwFrameFormat * GetFrameFormat()