blob: 7faec5c89f4c8c4026d47708648236cfcf68be76 [file] [log] [blame]
/**************************************************************
*
* 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 <com/sun/star/table/XTable.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/beans/XMultiPropertySet.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/table/XMergeableCellRange.hpp>
#include <com/sun/star/table/BorderLine.hpp>
#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<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(XML_left,pLeftBorder));
pTableStyle->getWholeTbl().getLineBorders().insert(std::pair<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(XML_right,pLeftBorder));
pTableStyle->getWholeTbl().getLineBorders().insert(std::pair<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(XML_top,pLeftBorder));
pTableStyle->getWholeTbl().getLineBorders().insert(std::pair<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(XML_bottom,pLeftBorder));
pTableStyle->getWholeTbl().getLineBorders().insert(std::pair<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(XML_insideH,pLeftBorder));
pTableStyle->getWholeTbl().getLineBorders().insert(std::pair<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(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<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(XML_bottom,pFstBottomBorder));
//last row style
pTableStyle->getLastRow().getFillProperties() = pFstRowFillProperties;
pTableStyle->getLastRow().getTextColor() = fstRowTextColor;
pTableStyle->getLastRow().getLineBorders().insert(std::pair<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(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<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(XML_bottom,pFstBottomBorder));
pTableStyle->getLastRow().getFillProperties() = pFstRowFillProperties;
pTableStyle->getLastRow().getTextColor() = fstRowTextColor;
pTableStyle->getLastRow().getLineBorders().insert(std::pair<sal_Int32, ::oox::drawingml::LinePropertiesPtr>(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;
}
}
} } }