/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "oox/drawingml/table/tableproperties.hxx" #include "oox/drawingml/drawingmltypes.hxx" #include #include #include #include #include #include #include "oox/core/xmlfilterbase.hxx" #include "oox/helper/propertyset.hxx" using rtl::OUString; using namespace ::oox::core; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::table; namespace oox { namespace drawingml { namespace table { TableProperties::TableProperties() : mbRtl( sal_False ) , mbFirstRow( sal_False ) , mbFirstCol( sal_False ) , mbLastRow( sal_False ) , mbLastCol( sal_False ) , mbBandRow( sal_False ) , mbBandCol( sal_False ) { } TableProperties::~TableProperties() { } void TableProperties::apply( const TablePropertiesPtr& /* rSourceTableProperties */ ) { } void CreateTableRows( uno::Reference< XTableRows > xTableRows, const std::vector< TableRow >& rvTableRows ) { if ( rvTableRows.size() > 1 ) xTableRows->insertByIndex( 0, rvTableRows.size() - 1 ); std::vector< TableRow >::const_iterator aTableRowIter( rvTableRows.begin() ); uno::Reference< container::XIndexAccess > xIndexAccess( xTableRows, UNO_QUERY_THROW ); for ( sal_Int32 n = 0; n < xIndexAccess->getCount(); n++ ) { static const rtl::OUString sHeight( RTL_CONSTASCII_USTRINGPARAM ( "Height" ) ); Reference< XPropertySet > xPropSet( xIndexAccess->getByIndex( n ), UNO_QUERY_THROW ); xPropSet->setPropertyValue( sHeight, Any( static_cast< sal_Int32 >( aTableRowIter->getHeight() / 360 ) ) ); aTableRowIter++; } } void CreateTableColumns( Reference< XTableColumns > xTableColumns, const std::vector< sal_Int32 >& rvTableGrid ) { if ( rvTableGrid.size() > 1 ) xTableColumns->insertByIndex( 0, rvTableGrid.size() - 1 ); std::vector< sal_Int32 >::const_iterator aTableGridIter( rvTableGrid.begin() ); uno::Reference< container::XIndexAccess > xIndexAccess( xTableColumns, UNO_QUERY_THROW ); for ( sal_Int32 n = 0; n < xIndexAccess->getCount(); n++ ) { static const rtl::OUString sWidth( RTL_CONSTASCII_USTRINGPARAM ( "Width" ) ); Reference< XPropertySet > xPropSet( xIndexAccess->getByIndex( n ), UNO_QUERY_THROW ); xPropSet->setPropertyValue( sWidth, Any( static_cast< sal_Int32 >( *aTableGridIter++ / 360 ) ) ); } } void MergeCells( const uno::Reference< XTable >& xTable, sal_Int32 nCol, sal_Int32 nRow, sal_Int32 nColSpan, sal_Int32 nRowSpan ) { if( xTable.is() ) try { Reference< XMergeableCellRange > xRange( xTable->createCursorByRange( xTable->getCellRangeByPosition( nCol, nRow,nCol + nColSpan - 1, nRow + nRowSpan - 1 ) ), UNO_QUERY_THROW ); if( xRange->isMergeable() ) xRange->merge(); } catch( Exception& ) { } } static TableStyle* pDefaultTableStyle = new TableStyle(); //for pptx just has table style id static void SetTableStyleProperties(TableStyle* &pTableStyle , const sal_Int32& tblFillClr,const sal_Int32& tblTextClr, const sal_Int32& lineBdrClr) { //whole table fill style and color oox::drawingml::FillPropertiesPtr pWholeTabFillProperties( new oox::drawingml::FillProperties ); pWholeTabFillProperties->moFillType.set(XML_solidFill); pWholeTabFillProperties->maFillColor.setSchemeClr(tblFillClr); pWholeTabFillProperties->maFillColor.addTransformation(XML_tint,20000); pTableStyle->getWholeTbl().getFillProperties() = pWholeTabFillProperties; //whole table text color ::oox::drawingml::Color tableTextColor; tableTextColor.setSchemeClr(tblTextClr); pTableStyle->getWholeTbl().getTextColor() = tableTextColor; //whole table line border oox::drawingml::LinePropertiesPtr pLeftBorder( new oox::drawingml::LineProperties); pLeftBorder->moLineWidth = 12700; pLeftBorder->moPresetDash = XML_sng; pLeftBorder->maLineFill.moFillType.set(XML_solidFill); pLeftBorder->maLineFill.maFillColor.setSchemeClr(lineBdrClr); pTableStyle->getWholeTbl().getLineBorders().insert(std::pair(XML_left,pLeftBorder)); pTableStyle->getWholeTbl().getLineBorders().insert(std::pair(XML_right,pLeftBorder)); pTableStyle->getWholeTbl().getLineBorders().insert(std::pair(XML_top,pLeftBorder)); pTableStyle->getWholeTbl().getLineBorders().insert(std::pair(XML_bottom,pLeftBorder)); pTableStyle->getWholeTbl().getLineBorders().insert(std::pair(XML_insideH,pLeftBorder)); pTableStyle->getWholeTbl().getLineBorders().insert(std::pair(XML_insideV,pLeftBorder)); //Band1H style oox::drawingml::FillPropertiesPtr pBand1HFillProperties( new oox::drawingml::FillProperties ); pBand1HFillProperties->moFillType.set(XML_solidFill); pBand1HFillProperties->maFillColor.setSchemeClr(tblFillClr); pBand1HFillProperties->maFillColor.addTransformation(XML_tint,40000); pTableStyle->getBand1H().getFillProperties() = pBand1HFillProperties; //Band1V style pTableStyle->getBand1V().getFillProperties() = pBand1HFillProperties; //tet bold for 1st row/last row/column ::boost::optional< sal_Bool > textBoldStyle(sal_True); pTableStyle->getFirstRow().getTextBoldStyle() = textBoldStyle; pTableStyle->getLastRow().getTextBoldStyle() = textBoldStyle; pTableStyle->getFirstCol().getTextBoldStyle() = textBoldStyle; pTableStyle->getLastCol().getTextBoldStyle() = textBoldStyle; } sal_Bool CreateTableStyle(TableStyle* &pTableStyle , const OUString& styleId) { sal_Bool createdTblStyle = sal_False; if(!styleId.compareToAscii("{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}")){ //Medium Style 2 Accenat 1 pTableStyle = new TableStyle(); createdTblStyle = sal_True; //first row style //fill color and type oox::drawingml::FillPropertiesPtr pFstRowFillProperties( new oox::drawingml::FillProperties ); pFstRowFillProperties->moFillType.set(XML_solidFill); pFstRowFillProperties->maFillColor.setSchemeClr(XML_accent1); pTableStyle->getFirstRow().getFillProperties() = pFstRowFillProperties; //text color ::oox::drawingml::Color fstRowTextColor; fstRowTextColor.setSchemeClr(XML_lt1); pTableStyle->getFirstRow().getTextColor() = fstRowTextColor; //bottom line border oox::drawingml::LinePropertiesPtr pFstBottomBorder( new oox::drawingml::LineProperties); pFstBottomBorder->moLineWidth = 38100; pFstBottomBorder->moPresetDash = XML_sng; pFstBottomBorder->maLineFill.moFillType.set(XML_solidFill); pFstBottomBorder->maLineFill.maFillColor.setSchemeClr(XML_lt1); pTableStyle->getFirstRow().getLineBorders().insert(std::pair(XML_bottom,pFstBottomBorder)); //last row style pTableStyle->getLastRow().getFillProperties() = pFstRowFillProperties; pTableStyle->getLastRow().getTextColor() = fstRowTextColor; pTableStyle->getLastRow().getLineBorders().insert(std::pair(XML_top,pFstBottomBorder)); //first column style pTableStyle->getFirstRow().getFillProperties() = pFstRowFillProperties; pTableStyle->getFirstRow().getTextColor() = fstRowTextColor; //last column style pTableStyle->getLastCol().getFillProperties() = pFstRowFillProperties; pTableStyle->getLastCol().getTextColor() = fstRowTextColor; SetTableStyleProperties(pTableStyle, XML_accent1, XML_dk1, XML_lt1); } else if (!styleId.compareToAscii("{21E4AEA4-8DFA-4A89-87EB-49C32662AFE0}")) //Medium Style 2 Accent 2 { pTableStyle = new TableStyle(); createdTblStyle = sal_True; oox::drawingml::FillPropertiesPtr pFstRowFillProperties( new oox::drawingml::FillProperties ); pFstRowFillProperties->moFillType.set(XML_solidFill); pFstRowFillProperties->maFillColor.setSchemeClr(XML_accent2); pTableStyle->getFirstRow().getFillProperties() = pFstRowFillProperties; ::oox::drawingml::Color fstRowTextColor; fstRowTextColor.setSchemeClr(XML_lt1); pTableStyle->getFirstRow().getTextColor() = fstRowTextColor; oox::drawingml::LinePropertiesPtr pFstBottomBorder( new oox::drawingml::LineProperties); pFstBottomBorder->moLineWidth = 38100; pFstBottomBorder->moPresetDash = XML_sng; pFstBottomBorder->maLineFill.moFillType.set(XML_solidFill); pFstBottomBorder->maLineFill.maFillColor.setSchemeClr(XML_lt1); pTableStyle->getFirstRow().getLineBorders().insert(std::pair(XML_bottom,pFstBottomBorder)); pTableStyle->getLastRow().getFillProperties() = pFstRowFillProperties; pTableStyle->getLastRow().getTextColor() = fstRowTextColor; pTableStyle->getLastRow().getLineBorders().insert(std::pair(XML_top,pFstBottomBorder)); pTableStyle->getFirstCol().getFillProperties() = pFstRowFillProperties; pTableStyle->getFirstCol().getTextColor() = fstRowTextColor; pTableStyle->getLastCol().getFillProperties() = pFstRowFillProperties; pTableStyle->getLastCol().getTextColor() = fstRowTextColor; SetTableStyleProperties(pTableStyle, XML_accent2, XML_dk1, XML_lt1); } else if (!styleId.compareToAscii("{C4B1156A-380E-4F78-BDF5-A606A8083BF9}")) //Medium Style 4 Accent 4 { pTableStyle = new TableStyle(); createdTblStyle = sal_True; SetTableStyleProperties(pTableStyle, XML_accent4, XML_dk1, XML_accent4); } return createdTblStyle; } //end const TableStyle& TableProperties::getUsedTableStyle( const ::oox::core::XmlFilterBase& rFilterBase, sal_Bool &isCreateTabStyle ) { ::oox::core::XmlFilterBase& rBase( const_cast< ::oox::core::XmlFilterBase& >( rFilterBase ) ); TableStyle* pTableStyle = NULL; if ( mpTableStyle ) pTableStyle = &*mpTableStyle; else if ( rBase.getTableStyles() ) { const std::vector< TableStyle >& rTableStyles( rBase.getTableStyles()->getTableStyles() ); const rtl::OUString aStyleId( getStyleId().getLength() ? getStyleId() : rBase.getTableStyles()->getDefaultStyleId() ); std::vector< TableStyle >::const_iterator aIter( rTableStyles.begin() ); while( aIter != rTableStyles.end() ) { if ( const_cast< TableStyle& >( *aIter ).getStyleId() == aStyleId ) { pTableStyle = &const_cast< TableStyle& >( *aIter ); break; // we get the correct style } aIter++; } //if the pptx just has table style id, but no table style content, we will create the table style ourselves if ( !pTableStyle ) { isCreateTabStyle = CreateTableStyle(pTableStyle , aStyleId); } } if ( !pTableStyle ) pTableStyle = pDefaultTableStyle; return *pTableStyle; } void TableProperties::pushToPropSet( const ::oox::core::XmlFilterBase& rFilterBase, const Reference < XPropertySet >& xPropSet, TextListStylePtr pMasterTextListStyle ) { TableStyleListPtr( const_cast< ::oox::core::XmlFilterBase& >( rFilterBase ).getTableStyles() ); uno::Reference< XColumnRowRange > xColumnRowRange( xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ), uno::UNO_QUERY_THROW ); CreateTableColumns( xColumnRowRange->getColumns(), mvTableGrid ); CreateTableRows( xColumnRowRange->getRows(), mvTableRows ); sal_Bool mbOwnTblStyle = sal_False; const TableStyle& rTableStyle( getUsedTableStyle( rFilterBase, mbOwnTblStyle ) ); sal_Int32 nRow = 0; std::vector< TableRow >::iterator aTableRowIter( mvTableRows.begin() ); while( aTableRowIter != mvTableRows.end() ) { sal_Int32 nColumn = 0; std::vector< TableCell >::iterator aTableCellIter( aTableRowIter->getTableCells().begin() ); while( aTableCellIter != aTableRowIter->getTableCells().end() ) { TableCell& rTableCell( *aTableCellIter ); if ( !rTableCell.getvMerge() && !rTableCell.gethMerge() ) { uno::Reference< XTable > xTable( xColumnRowRange, uno::UNO_QUERY_THROW ); if ( ( rTableCell.getRowSpan() > 1 ) || ( rTableCell.getGridSpan() > 1 ) ) MergeCells( xTable, nColumn, nRow, rTableCell.getGridSpan(), rTableCell.getRowSpan() ); Reference< XCellRange > xCellRange( xTable, UNO_QUERY_THROW ); rTableCell.pushToXCell( rFilterBase, pMasterTextListStyle, xCellRange->getCellByPosition( nColumn, nRow ), *this, rTableStyle, nColumn, aTableRowIter->getTableCells().size(), nRow, mvTableRows.size() ); } nColumn++; aTableCellIter++; } nRow++; aTableRowIter++; } if(mbOwnTblStyle == sal_True) { TableStyle* pTableStyle = (TableStyle*)&rTableStyle; if(pTableStyle != NULL) { delete pTableStyle; pTableStyle = NULL; } mbOwnTblStyle = sal_False; } } } } }