22 #include <com/sun/star/frame/XModel.hpp>
23 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
24 #include <com/sun/star/table/XTableRows.hpp>
25 #include <com/sun/star/table/XMergeableCell.hpp>
26 #include <com/sun/star/table/XMergeableCellRange.hpp>
27 #include <com/sun/star/table/XTable.hpp>
28 #include <com/sun/star/text/XText.hpp>
29 #include <com/sun/star/container/XNameContainer.hpp>
30 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
31 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
32 #include <com/sun/star/style/XStyle.hpp>
67 OUString msDefaultCellStyleName;
76 sal_Int32 nElement,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList )
override;
84 sal_Int32 mnStartColumn;
86 sal_Int32 mnEndColumn;
89 MergeInfo( sal_Int32 nStartColumn, sal_Int32 nStartRow, sal_Int32 nColumnSpan, sal_Int32 nRowSpan )
90 : mnStartColumn( nStartColumn ), mnStartRow( nStartRow ), mnEndColumn( nStartColumn + nColumnSpan - 1 ), mnEndRow( nStartRow + nRowSpan - 1 ) {};
104 const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList )
override;
106 virtual void SAL_CALL
endFastElement(sal_Int32 nElement)
override;
116 css::uno::Reference< css::table::XTable >
mxTable;
136 const Reference< XMergeableCell >& xCell,
137 const OUString& sDefaultCellStyleName,
139 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
143 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
override;
145 virtual void SAL_CALL
endFastElement(sal_Int32 nElement)
override;
147 sal_Int32 getColumnSpan()
const {
return mnColSpan; }
148 sal_Int32 getRowSpan()
const {
return mnRowSpan; }
149 sal_Int32 getRepeated()
const {
return mnRepeated; }
151 Reference< XMergeableCell > mxCell;
152 Reference< XTextCursor > mxCursor;
153 Reference< XTextCursor > mxOldCursor;
154 bool mbListContextPushed;
166 sal_Int32 nElement,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList )
override;
168 virtual void SAL_CALL
endFastElement(sal_Int32 nElement)
override;
173 const OUString&
rValue )
override;
176 OUString msTemplateStyleName;
188 css::uno::Reference< css::xml::sax::XFastContextHandler > XMLProxyContext::createFastChildContext( sal_Int32 nElement,
const Reference< XFastAttributeList >& xAttrList )
191 return mxParent->createFastChildContext( nElement, xAttrList );
197 : mrImport( rImport )
199 bool bWriter =
false;
201 Reference<XMultiServiceFactory> xFac(rImport.
GetModel(), UNO_QUERY);
209 SAL_WARN(
"xmloff.table",
"Error while checking available service names");
242 return new XMLTableTemplateContext(
mrImport );
247 auto xPtr = std::make_shared<XMLTableTemplate>();
248 xPtr->swap( xTableTemplate );
260 Reference<XStyleFamiliesSupplier> xFamiliesSupp(
mrImport.
GetModel(), UNO_QUERY_THROW);
263 Reference<XNameContainer> xTableFamily(xFamilies->getByName(
"TableStyles"), UNO_QUERY_THROW);
264 Reference<XIndexAccess> xCellFamily(xFamilies->getByName(
"CellStyles"), UNO_QUERY_THROW);
268 Reference<XNameReplace> xTemplate(
xFactory->createInstance(
"com.sun.star.style.TableStyle"), UNO_QUERY_THROW);
270 std::shared_ptr<XMLTableTemplate> xT(it->second);
272 for (
const auto& rStyle : *xT)
try
274 const OUString sPropName(rStyle.first);
275 const OUString sStyleName(rStyle.second);
279 sal_Int32
nCount = xCellFamily->getCount();
280 for (sal_Int32
i=0;
i < nCount; ++
i)
282 Any xCellStyle = xCellFamily->getByIndex(
i);
284 xCellStyle.get<Reference<XStyle>>()->getName());
285 if (sEncodedStyleName == sStyleName)
287 xTemplate->replaceByName(sPropName, xCellStyle);
299 if (xTableFamily->hasByName(sTemplateName) && bOverwrite)
300 xTableFamily->replaceByName(sTemplateName,
Any(xTemplate));
302 xTableFamily->insertByName(sTemplateName,
Any(xTemplate));
318 Reference< XStyleFamiliesSupplier > xFamiliesSupp(
mrImport.
GetModel(), UNO_QUERY_THROW );
321 Reference< XNameContainer > xTableFamily( xFamilies->getByName(
"table" ), UNO_QUERY_THROW );
324 Reference< XSingleServiceFactory >
xFactory( xTableFamily, UNO_QUERY_THROW );
329 Reference< XNameReplace > xTemplate( xFactory->createInstance(), UNO_QUERY_THROW );
331 std::shared_ptr< XMLTableTemplate > xT( rTemplate.second );
333 for(
const auto& rStyle : *xT )
try
335 const OUString sPropName( rStyle.first );
336 const OUString sStyleName( rStyle.second );
337 xTemplate->replaceByName( sPropName, xCellFamily->getByName( sStyleName ) );
346 if( xTableFamily->hasByName( sTemplateName ) )
347 xTableFamily->replaceByName( sTemplateName,
Any( xTemplate ) );
349 xTableFamily->insertByName( sTemplateName,
Any( xTemplate ) );
367 , mxTable( xColumnRowRange, UNO_QUERY )
368 , mxColumns( xColumnRowRange->getColumns() )
369 , mxRows( xColumnRowRange->getRows() )
371 , mnCurrentColumn( -1 )
379 auto xInfo = std::make_shared<ColumnInfo>();
381 sal_Int32 nRepeated = 1;
386 switch (aIter.getToken())
389 nRepeated = aIter.toInt32();
392 xInfo->msStyleName = aIter.toString();
395 xInfo->msDefaultCellStyleName = aIter.toString();
427 const sal_Int32 nCount1 =
mxColumns->getCount();
428 const sal_Int32 nCount2 = sal::static_int_cast< sal_Int32 >(
maColumnInfos.size() );
429 if( nCount1 < nCount2 )
430 mxColumns->insertByIndex( nCount1, nCount2 - nCount1 );
434 for( sal_Int32 nCol = 0; nCol < nCount2; nCol++ )
438 if( pAutoStyles && !xInfo->msStyleName.isEmpty() )
469 const sal_Int32 nRowCount =
mxRows->getCount();
473 mxRows->insertByIndex( nRowCount, nCount );
483 switch(aIter.getToken())
486 sStyleName = aIter.toString();
497 if( !sStyleName.isEmpty() )
515 return new XMLProxyContext(
GetImport(), xThis );
529 const sal_Int32 nColumnSpan = pCellContext->getColumnSpan();
530 const sal_Int32 nRowSpan = pCellContext->getRowSpan();
531 if( (nColumnSpan > 1) || (nRowSpan > 1) )
534 const sal_Int32 nRepeated = pCellContext->getRepeated();
537 OSL_FAIL(
"xmloff::XMLTableImportContext::ImportCell(), import of repeated Cells not implemented (TODO)");
553 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
559 return ImportCell( nElement, xAttrList ).get();
568 return new XMLProxyContext(
GetImport(), xThis );
571 SAL_WARN(
"xmloff",
"unknown element");
577 for(
const std::shared_ptr< MergeInfo >& xInfo :
maMergeInfos )
581 Reference< XCellRange > xRange(
mxTable->getCellRangeByPosition( xInfo->mnStartColumn, xInfo->mnStartRow, xInfo->mnEndColumn, xInfo->mnEndRow ) );
582 Reference< XMergeableCellRange > xCursor(
mxTable->createCursorByRange( xRange ), UNO_QUERY_THROW );
605 XMLCellImportContext::XMLCellImportContext(
SvXMLImport& rImport,
606 const Reference< XMergeableCell >& xCell,
607 const OUString& sDefaultCellStyleName,
609 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
612 , mbListContextPushed( false )
622 switch (aIter.getToken())
646 if( sStyleName.isEmpty() )
647 sStyleName = sDefaultCellStyleName;
649 if( sStyleName.isEmpty() )
664 const_cast< XMLPropStyleContext* >( pStyle )->FillPropertySet( xCellSet );
668 css::uno::Reference< css::xml::sax::XFastContextHandler > XMLCellImportContext::createFastChildContext(
670 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
675 Reference< XText > xText( mxCell, UNO_QUERY );
679 mxOldCursor = xTxtImport->GetCursor();
680 mxCursor = xText->createTextCursor();
682 xTxtImport->SetCursor( mxCursor );
686 xTxtImport->PushListContext();
687 mbListContextPushed =
true;
696 pContext = GetImport().GetTextImport()->CreateTextChildContext( GetImport(), nElement, xAttrList );
704 void XMLCellImportContext::endFastElement(sal_Int32 )
709 mxCursor->gotoEnd(
false );
710 mxCursor->goLeft( 1,
true );
711 mxCursor->setString(
"" );
714 GetImport().GetTextImport()->ResetCursor();
718 GetImport().GetTextImport()->SetCursor( mxOldCursor );
721 if (mbListContextPushed) {
722 GetImport().GetTextImport()->PopListContext();
727 XMLTableTemplateContext::XMLTableTemplateContext(
SvXMLImport& rImport )
732 void XMLTableTemplateContext::SetAttribute( sal_Int32 nElement,
739 msTemplateStyleName =
rValue;
743 void XMLTableTemplateContext::endFastElement(sal_Int32 )
746 if( xTableImport.is() )
747 xTableImport->addTableTemplate( msTemplateStyleName, maTableTemplate );
750 void XMLTableTemplateContext::CreateAndInsert(
bool bOverwrite)
753 if(xTableImport.is())
754 xTableImport->insertTabletemplate(msTemplateStyleName, bOverwrite);
757 css::uno::Reference< css::xml::sax::XFastContextHandler > XMLTableTemplateContext::createFastChildContext(
759 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
772 switch (aIter.getToken())
794 switch (aIter.getToken())
rtl::Reference< SvXMLImportPropertyMapper > mxColumnImportPropertySetMapper
friend class XMLTableImportContext
const TableStyleElement * getTableStyleMap()
sal_Int32 findValue(const css::uno::Sequence< T1 > &_rList, const T2 &_rValue)
::xmloff::token::XMLTokenEnum meElement
WeakReference< XInterface > mxParent
SvXMLImport & GetImport()
sal_Int32 toInt32(OUString const &rStr)
SvXMLImportContext * CreateTableContext(css::uno::Reference< css::table::XColumnRowRange > const &xColumnRowRange)
constexpr sal_uInt16 XML_NAMESPACE_LO_EXT
std::map< OUString, OUString > XMLTableTemplate
FastAttributeList & castToFastAttributeList(const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
SvXMLImportContextRef ImportColumn(const Reference< XFastAttributeList > &xAttrList)
OUString GetDefaultCellStyleName() const
void insertTabletemplate(const OUString &rsStyleName, bool bOverwrite)
Inserts to the doc template with given name.
SvXMLImportContext * ImportRow(const Reference< XFastAttributeList > &xAttrList)
char const sTemplateName[]
const XMLPropertyMapEntry * getCellPropertiesMap()
XMLTableImport(SvXMLImport &rImport, const rtl::Reference< XMLPropertySetMapper > &xCellPropertySetMapper, const rtl::Reference< XMLPropertyHandlerFactory > &xFactoryRef)
MergeInfoVector maMergeInfos
css::uno::Any const & rValue
sal_Int32 mnCurrentColumn
#define XMLOFF_WARN_UNKNOWN(area, rIter)
XMLTableTemplateMap maTableTemplates
rtl::Reference< SvXMLImportPropertyMapper > mxCellImportPropertySetMapper
#define TOOLS_WARN_EXCEPTION(area, stream)
const TableStyleElement * getWriterSpecificTableStyleMap()
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &AttrList) override
SvXMLImportContextRef ImportCell(sal_Int32 nElement, const Reference< XFastAttributeList > &xAttrList)
virtual ~XMLTableImport() override
const XMLPropertyMapEntry * getColumnPropertiesMap()
virtual void SetAttribute(sal_Int32 nElement, const OUString &rValue)
void finishStyles()
Inserts all table templates.
Reference< XTableColumns > mxColumns
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override
endFastElement is called before a context will be destructed, but after an elements context has been ...
std::vector< std::shared_ptr< MergeInfo > > MergeInfoVector
std::vector< std::shared_ptr< ColumnInfo > > maColumnInfos
static SvXMLImportPropertyMapper * CreateTableCellExtPropMapper(SvXMLImport &)
This class deliberately does not support XWeak, to improve performance when loading large documents...
virtual void CreateAndInsert(bool bOverwrite)
constexpr sal_uInt16 XML_NAMESPACE_TABLE
constexpr bool IsTokenInNamespace(sal_Int32 nToken, sal_uInt16 nNamespacePrefix)
virtual void SAL_CALL endFastElement(sal_Int32 Element) override
endFastElement is called before a context will be destructed, but after an elements context has been ...
Handling of tokens in XML:
Reference< XTableRows > mxRows
virtual css::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
const XMLPropertyMapEntry * getRowPropertiesMap()
#define XML_ELEMENT(prefix, name)
const SvXMLUnitConverter & GetMM100UnitConverter() const
rtl::Reference< SvXMLImportPropertyMapper > mxRowImportPropertySetMapper
const css::uno::Reference< css::frame::XModel > & GetModel() const
SvXMLStyleContext * CreateTableTemplateContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
OUString encodeStyleName(const OUString &rName, bool *pEncoded=nullptr) const
css::uno::Reference< css::table::XTable > mxTable
const SvXMLStyleContext * FindStyleChildContext(XmlStyleFamily nFamily, const OUString &rName, bool bCreateIndex=false) const
void addTableTemplate(const OUString &rsStyleName, XMLTableTemplate &xTableTemplate)
#define SAL_WARN(area, stream)
XMLTableImportContext(const rtl::Reference< XMLTableImport > &xThis, Reference< XColumnRowRange > const &xColumnRowRange)
Reference< XSingleServiceFactory > xFactory
constexpr sal_Int32 TOKEN_MASK
#define XMLOFF_WARN_UNKNOWN_ELEMENT(area, token)
static SvXMLImportPropertyMapper * CreateParaExtPropMapper(SvXMLImport &)
OUString msDefaultCellStyleName
rtl::Reference< XMLShapeImportHelper > const & GetShapeImport()
OUString toString(OptionInfo const *info)