/************************************************************** * * 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/tablecell.hxx" #include "oox/drawingml/table/tableproperties.hxx" #include "oox/drawingml/shapepropertymap.hxx" #include "oox/drawingml/textbody.hxx" #include "oox/core/xmlfilterbase.hxx" #include "oox/helper/propertyset.hxx" #include #include #include #include #include #include #include #include #include #include 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 ::com::sun::star::table::BorderLine; using ::com::sun::star::drawing::LineStyle; namespace oox { namespace drawingml { namespace table { TableCell::TableCell() : mnRowSpan ( 1 ) , mnGridSpan( 1 ) , mbhMerge( sal_False ) , mbvMerge( sal_False ) , mnMarL( 91440 ) , mnMarR( 91440 ) , mnMarT( 45720 ) , mnMarB( 45720 ) , mnVertToken( XML_horz ) , mnAnchorToken( XML_t ) , mbAnchorCtr( sal_False ) , mnHorzOverflowToken( XML_clip ) { } TableCell::~TableCell() { } void applyLineAttributes( const ::oox::core::XmlFilterBase& rFilterBase, Reference< XPropertySet >& rxPropSet, oox::drawingml::LineProperties& rLineProperties, sal_Int32 nPropId ) { BorderLine aBorderLine( 0, 0, 0, 0 ); if( rLineProperties.maLineFill.moFillType.differsFrom( XML_noFill ) ) { Color aColor = rLineProperties.maLineFill.getBestSolidColor(); aBorderLine.Color = aColor.getColor( rFilterBase.getGraphicHelper() ); aBorderLine.OuterLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) / 4 ); aBorderLine.InnerLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) / 4 ); aBorderLine.LineDistance = 0; } PropertySet aPropSet( rxPropSet ); aPropSet.setProperty( nPropId, aBorderLine ); } void applyBorder( TableStylePart& rTableStylePart, sal_Int32 nLineType, oox::drawingml::LineProperties& rLineProperties ) { std::map < sal_Int32, ::oox::drawingml::LinePropertiesPtr >& rPartLineBorders( rTableStylePart.getLineBorders() ); std::map < sal_Int32, ::oox::drawingml::LinePropertiesPtr >::const_iterator aIter( rPartLineBorders.find( nLineType ) ); if ( ( aIter != rPartLineBorders.end() ) && aIter->second.get() ) rLineProperties.assignUsed( *aIter->second ); } void applyTableStylePart( const ::oox::core::XmlFilterBase& rFilterBase, const Reference < ::com::sun::star::table::XCell >& rxCell, oox::drawingml::FillProperties& rFillProperties, oox::drawingml::LineProperties& rLeftBorder, oox::drawingml::LineProperties& rRightBorder, oox::drawingml::LineProperties& rTopBorder, oox::drawingml::LineProperties& rBottomBorder, oox::drawingml::LineProperties& rTopLeftToBottomRightBorder, oox::drawingml::LineProperties& rBottomLeftToTopRightBorder, TableStylePart& rTableStylePart ) { boost::shared_ptr< ::oox::drawingml::FillProperties >& rPartFillPropertiesPtr( rTableStylePart.getFillProperties() ); if ( rPartFillPropertiesPtr.get() ) rFillProperties.assignUsed( *rPartFillPropertiesPtr ); applyBorder( rTableStylePart, XML_left, rLeftBorder ); applyBorder( rTableStylePart, XML_right, rRightBorder ); applyBorder( rTableStylePart, XML_top, rTopBorder ); applyBorder( rTableStylePart, XML_bottom, rBottomBorder ); applyBorder( rTableStylePart, XML_tl2br, rTopLeftToBottomRightBorder ); applyBorder( rTableStylePart, XML_tr2bl, rBottomLeftToTopRightBorder ); TextCharacterProperties aTextCharProps; aTextCharProps.maLatinFont = rTableStylePart.getLatinFont(); aTextCharProps.maAsianFont = rTableStylePart.getAsianFont(); aTextCharProps.maComplexFont = rTableStylePart.getComplexFont(); aTextCharProps.maSymbolFont = rTableStylePart.getSymbolFont(); aTextCharProps.maCharColor = rTableStylePart.getTextColor(); PropertySet aPropSet( rxCell ); aTextCharProps.pushToPropSet( aPropSet, rFilterBase ); } void applyTableCellProperties( const Reference < ::com::sun::star::table::XCell >& rxCell, const TableCell& rTableCell ) { static const rtl::OUString sTopBorder( RTL_CONSTASCII_USTRINGPARAM( "TextUpperDistance" ) ); static const rtl::OUString sBottomBorder( RTL_CONSTASCII_USTRINGPARAM( "TextLowerDistance" ) ); static const rtl::OUString sLeftBorder( RTL_CONSTASCII_USTRINGPARAM( "TextLeftDistance" ) ); static const rtl::OUString sRightBorder( RTL_CONSTASCII_USTRINGPARAM( "TextRightDistance" ) ); static const rtl::OUString sVerticalAdjust( RTL_CONSTASCII_USTRINGPARAM( "TextVerticalAdjust" ) ); Reference< XPropertySet > xPropSet( rxCell, UNO_QUERY_THROW ); xPropSet->setPropertyValue( sTopBorder, Any( static_cast< sal_Int32 >( rTableCell.getTopMargin() / 360 ) ) ); xPropSet->setPropertyValue( sRightBorder, Any( static_cast< sal_Int32 >( rTableCell.getRightMargin() / 360 ) ) ); xPropSet->setPropertyValue( sLeftBorder, Any( static_cast< sal_Int32 >( rTableCell.getLeftMargin() / 360 ) ) ); xPropSet->setPropertyValue( sBottomBorder, Any( static_cast< sal_Int32 >( rTableCell.getBottomMargin() / 360 ) ) ); drawing::TextVerticalAdjust eVA; switch( rTableCell.getAnchorToken() ) { case XML_ctr: eVA = drawing::TextVerticalAdjust_CENTER; break; case XML_b: eVA = drawing::TextVerticalAdjust_BOTTOM; break; case XML_just: case XML_dist: default: case XML_t: eVA = drawing::TextVerticalAdjust_TOP; break; } xPropSet->setPropertyValue( sVerticalAdjust, Any( eVA ) ); } // save char color from tblstyle for combination later void lcl_getCharPropFromTblStylePart(TextCharacterProperties& rDstCharProp, const TableStylePart& rSrcTblStyle) { const Color& clr = const_cast(rSrcTblStyle).getTextColor(); if (clr.isUsed()) rDstCharProp.maCharColor = clr; // TODO: there may be other similar properties from tblstyle which need combination later } void TableCell::pushToXCell( const ::oox::core::XmlFilterBase& rFilterBase, ::oox::drawingml::TextListStylePtr pMasterTextListStyle, const ::com::sun::star::uno::Reference < ::com::sun::star::table::XCell >& rxCell, const TableProperties& rTableProperties, const TableStyle& rTableStyle, sal_Int32 nColumn, sal_Int32 nMaxColumn, sal_Int32 nRow, sal_Int32 nMaxRow ) { TableStyle& rTable( const_cast< TableStyle& >( rTableStyle ) ); TableProperties& rProperties( const_cast< TableProperties& >( rTableProperties ) ); Reference< text::XText > xText( rxCell, UNO_QUERY_THROW ); Reference< text::XTextCursor > xAt = xText->createTextCursor(); applyTableCellProperties( rxCell, *this ); Reference< XPropertySet > xPropSet( rxCell, UNO_QUERY_THROW ); oox::drawingml::FillProperties aFillProperties; oox::drawingml::LineProperties aLinePropertiesLeft; oox::drawingml::LineProperties aLinePropertiesRight; oox::drawingml::LineProperties aLinePropertiesTop; oox::drawingml::LineProperties aLinePropertiesBottom; oox::drawingml::LineProperties aLinePropertiesTopLeftToBottomRight; oox::drawingml::LineProperties aLinePropertiesBottomLeftToTopRight; boost::shared_ptr< ::oox::drawingml::FillProperties >& rBackgroundFillPropertiesPtr( rTable.getBackgroundFillProperties() ); if ( rBackgroundFillPropertiesPtr.get() ) aFillProperties.assignUsed( *rBackgroundFillPropertiesPtr ); applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getWholeTbl() ); // get char color from tblstyle for combination later TextCharacterProperties aTextCharProps; lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getWholeTbl()); if ( rProperties.isFirstRow() && ( nRow == 0 ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getFirstRow() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getFirstRow()); } if ( rProperties.isLastRow() && ( nRow == nMaxRow ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getLastRow() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getLastRow()); } if ( rProperties.isFirstCol() && ( nColumn == 0 ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getFirstCol() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getFirstCol()); } if ( rProperties.isLastCol() && ( nColumn == nMaxColumn ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getLastCol() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getLastCol()); } if ( rProperties.isBandRow() ) { if ( ( !rProperties.isFirstRow() || ( nRow != 0 ) ) && ( !rProperties.isLastRow() || ( nRow != nMaxRow ) ) ) { sal_Int32 nBand = nRow; if ( rProperties.isFirstRow() ) nBand++; if ( nBand & 1 ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getBand2H() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getBand2H()); } else { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getBand1H() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getBand1H()); } } } if ( ( nRow == 0 ) && ( nColumn == 0 ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getNwCell() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getNwCell()); } if ( ( nRow == nMaxRow ) && ( nColumn == 0 ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getSwCell() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getSwCell()); } if ( ( nRow == 0 ) && ( nColumn == nMaxColumn ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getNeCell() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getNeCell()); } if ( ( nRow == nMaxColumn ) && ( nColumn == nMaxColumn ) ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getSeCell() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getSeCell()); } if ( rProperties.isBandCol() ) { if ( ( !rProperties.isFirstCol() || ( nColumn != 0 ) ) && ( !rProperties.isLastCol() || ( nColumn != nMaxColumn ) ) ) { sal_Int32 nBand = nColumn; if ( rProperties.isFirstCol() ) nBand++; if ( nBand & 1 ) { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getBand2V() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getBand2V()); } else { applyTableStylePart( rFilterBase, rxCell, aFillProperties, aLinePropertiesLeft, aLinePropertiesRight, aLinePropertiesTop, aLinePropertiesBottom, aLinePropertiesTopLeftToBottomRight, aLinePropertiesBottomLeftToTopRight, rTable.getBand1V() ); lcl_getCharPropFromTblStylePart(aTextCharProps, rTable.getBand1V()); } } } getTextBody()->insertAt( rFilterBase, xText, xAt, aTextCharProps, pMasterTextListStyle ); aLinePropertiesLeft.assignUsed( maLinePropertiesLeft ); aLinePropertiesRight.assignUsed( maLinePropertiesRight ); aLinePropertiesTop.assignUsed( maLinePropertiesTop ); aLinePropertiesBottom.assignUsed( maLinePropertiesBottom ); aLinePropertiesTopLeftToBottomRight.assignUsed( maLinePropertiesTopLeftToBottomRight ); aLinePropertiesBottomLeftToTopRight.assignUsed( maLinePropertiesBottomLeftToTopRight ); applyLineAttributes( rFilterBase, xPropSet, aLinePropertiesLeft, PROP_LeftBorder ); applyLineAttributes( rFilterBase, xPropSet, aLinePropertiesRight, PROP_RightBorder ); applyLineAttributes( rFilterBase, xPropSet, aLinePropertiesTop, PROP_TopBorder ); applyLineAttributes( rFilterBase, xPropSet, aLinePropertiesBottom, PROP_BottomBorder ); applyLineAttributes( rFilterBase, xPropSet, aLinePropertiesTopLeftToBottomRight, PROP_DiagonalTLBR ); applyLineAttributes( rFilterBase, xPropSet, aLinePropertiesBottomLeftToTopRight, PROP_DiagonalBLTR ); aFillProperties.assignUsed( maFillProperties ); ShapePropertyMap aPropMap( rFilterBase.getModelObjectHelper() ); // TODO: phClr? aFillProperties.pushToPropMap( aPropMap, rFilterBase.getGraphicHelper() ); PropertySet( xPropSet ).setProperties( aPropMap ); if ( getVertToken() == XML_eaVert ) { xPropSet->setPropertyValue(::rtl::OUString::createFromAscii( "TextWritingMode" ) , Any(com::sun::star::text::WritingMode_TB_RL) ); } } } } }