1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "drawingml/table/tableproperties.hxx"
21 #include "drawingml/table/tablestylelist.hxx"
22 #include "oox/drawingml/drawingmltypes.hxx"
23 #include <com/sun/star/table/XTable.hpp>
24 #include <com/sun/star/container/XNameContainer.hpp>
25 #include <com/sun/star/beans/XMultiPropertySet.hpp>
26 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
27 #include <com/sun/star/table/XMergeableCellRange.hpp>
28 #include <com/sun/star/table/BorderLine2.hpp>
29 #include <rtl/instance.hxx>
30 #include "oox/core/xmlfilterbase.hxx"
31 #include "oox/helper/propertyset.hxx"
33 using namespace ::oox::core
;
34 using namespace ::com::sun::star
;
35 using namespace ::com::sun::star::uno
;
36 using namespace ::com::sun::star::beans
;
37 using namespace ::com::sun::star::table
;
39 namespace oox
{ namespace drawingml
{ namespace table
{
41 TableProperties::TableProperties()
51 TableProperties::~TableProperties()
55 void CreateTableRows( uno::Reference
< XTableRows
> xTableRows
, const std::vector
< TableRow
>& rvTableRows
)
57 if ( rvTableRows
.size() > 1 )
58 xTableRows
->insertByIndex( 0, rvTableRows
.size() - 1 );
59 std::vector
< TableRow
>::const_iterator
aTableRowIter( rvTableRows
.begin() );
60 uno::Reference
< container::XIndexAccess
> xIndexAccess( xTableRows
, UNO_QUERY_THROW
);
61 const OUString
sHeight("Height");
62 for ( sal_Int32 n
= 0; n
< xIndexAccess
->getCount(); n
++ )
64 Reference
< XPropertySet
> xPropSet( xIndexAccess
->getByIndex( n
), UNO_QUERY_THROW
);
65 xPropSet
->setPropertyValue( sHeight
, Any( static_cast< sal_Int32
>( aTableRowIter
->getHeight() / 360 ) ) );
70 void CreateTableColumns( Reference
< XTableColumns
> xTableColumns
, const std::vector
< sal_Int32
>& rvTableGrid
)
72 if ( rvTableGrid
.size() > 1 )
73 xTableColumns
->insertByIndex( 0, rvTableGrid
.size() - 1 );
74 std::vector
< sal_Int32
>::const_iterator
aTableGridIter( rvTableGrid
.begin() );
75 uno::Reference
< container::XIndexAccess
> xIndexAccess( xTableColumns
, UNO_QUERY_THROW
);
76 const OUString
sWidth("Width");
77 for ( sal_Int32 n
= 0; n
< xIndexAccess
->getCount(); n
++ )
79 Reference
< XPropertySet
> xPropSet( xIndexAccess
->getByIndex( n
), UNO_QUERY_THROW
);
80 xPropSet
->setPropertyValue( sWidth
, Any( static_cast< sal_Int32
>( *aTableGridIter
++ / 360 ) ) );
84 void MergeCells( const uno::Reference
< XTable
>& xTable
, sal_Int32 nCol
, sal_Int32 nRow
, sal_Int32 nColSpan
, sal_Int32 nRowSpan
)
88 Reference
< XMergeableCellRange
> xRange( xTable
->createCursorByRange( xTable
->getCellRangeByPosition( nCol
, nRow
,nCol
+ nColSpan
- 1, nRow
+ nRowSpan
- 1 ) ), UNO_QUERY_THROW
);
89 if( xRange
->isMergeable() )
99 struct theDefaultTableStyle
: public ::rtl::Static
< TableStyle
, theDefaultTableStyle
> {};
102 //for pptx just has table style id
103 static void SetTableStyleProperties(TableStyle
* &pTableStyle
, const sal_Int32
& tblFillClr
,const sal_Int32
& tblTextClr
, const sal_Int32
& lineBdrClr
)
105 //whole table fill style and color
106 oox::drawingml::FillPropertiesPtr
pWholeTabFillProperties( new oox::drawingml::FillProperties
);
107 pWholeTabFillProperties
->moFillType
.set(XML_solidFill
);
108 pWholeTabFillProperties
->maFillColor
.setSchemeClr(tblFillClr
);
109 pWholeTabFillProperties
->maFillColor
.addTransformation(XML_tint
,20000);
110 pTableStyle
->getWholeTbl().getFillProperties() = pWholeTabFillProperties
;
111 //whole table text color
112 ::oox::drawingml::Color tableTextColor
;
113 tableTextColor
.setSchemeClr(tblTextClr
);
114 pTableStyle
->getWholeTbl().getTextColor() = tableTextColor
;
115 //whole table line border
116 oox::drawingml::LinePropertiesPtr
pLeftBorder( new oox::drawingml::LineProperties
);
117 pLeftBorder
->moLineWidth
= 12700;
118 pLeftBorder
->moPresetDash
= XML_sng
;
119 pLeftBorder
->maLineFill
.moFillType
.set(XML_solidFill
);
120 pLeftBorder
->maLineFill
.maFillColor
.setSchemeClr(lineBdrClr
);
121 pTableStyle
->getWholeTbl().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_left
,pLeftBorder
));
122 pTableStyle
->getWholeTbl().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_right
,pLeftBorder
));
123 pTableStyle
->getWholeTbl().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_top
,pLeftBorder
));
124 pTableStyle
->getWholeTbl().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_bottom
,pLeftBorder
));
125 pTableStyle
->getWholeTbl().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_insideH
,pLeftBorder
));
126 pTableStyle
->getWholeTbl().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_insideV
,pLeftBorder
));
129 oox::drawingml::FillPropertiesPtr
pBand1HFillProperties( new oox::drawingml::FillProperties
);
130 pBand1HFillProperties
->moFillType
.set(XML_solidFill
);
131 pBand1HFillProperties
->maFillColor
.setSchemeClr(tblFillClr
);
132 pBand1HFillProperties
->maFillColor
.addTransformation(XML_tint
,40000);
133 pTableStyle
->getBand1H().getFillProperties() = pBand1HFillProperties
;
136 pTableStyle
->getBand1V().getFillProperties() = pBand1HFillProperties
;
138 //tet bold for 1st row/last row/column
139 ::boost::optional
< sal_Bool
> textBoldStyle(sal_True
);
140 pTableStyle
->getFirstRow().getTextBoldStyle() = textBoldStyle
;
141 pTableStyle
->getLastRow().getTextBoldStyle() = textBoldStyle
;
142 pTableStyle
->getFirstCol().getTextBoldStyle() = textBoldStyle
;
143 pTableStyle
->getLastCol().getTextBoldStyle() = textBoldStyle
;
146 TableStyle
* CreateTableStyle(const OUString
& styleId
)
148 TableStyle
* pTableStyle
= NULL
;
149 if(styleId
== "{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}") { //Medium Style 2 Accent 1
150 pTableStyle
= new TableStyle();
152 //fill color and type
153 oox::drawingml::FillPropertiesPtr
pFstRowFillProperties( new oox::drawingml::FillProperties
);
154 pFstRowFillProperties
->moFillType
.set(XML_solidFill
);
155 pFstRowFillProperties
->maFillColor
.setSchemeClr(XML_accent1
);
156 pTableStyle
->getFirstRow().getFillProperties() = pFstRowFillProperties
;
158 ::oox::drawingml::Color fstRowTextColor
;
159 fstRowTextColor
.setSchemeClr(XML_lt1
);
160 pTableStyle
->getFirstRow().getTextColor() = fstRowTextColor
;
162 oox::drawingml::LinePropertiesPtr
pFstBottomBorder( new oox::drawingml::LineProperties
);
163 pFstBottomBorder
->moLineWidth
= 38100;
164 pFstBottomBorder
->moPresetDash
= XML_sng
;
165 pFstBottomBorder
->maLineFill
.moFillType
.set(XML_solidFill
);
166 pFstBottomBorder
->maLineFill
.maFillColor
.setSchemeClr(XML_lt1
);
167 pTableStyle
->getFirstRow().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_bottom
,pFstBottomBorder
));
170 pTableStyle
->getLastRow().getFillProperties() = pFstRowFillProperties
;
171 pTableStyle
->getLastRow().getTextColor() = fstRowTextColor
;
172 pTableStyle
->getLastRow().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_top
,pFstBottomBorder
));
175 pTableStyle
->getFirstRow().getFillProperties() = pFstRowFillProperties
;
176 pTableStyle
->getFirstRow().getTextColor() = fstRowTextColor
;
179 pTableStyle
->getLastCol().getFillProperties() = pFstRowFillProperties
;
180 pTableStyle
->getLastCol().getTextColor() = fstRowTextColor
;
182 SetTableStyleProperties(pTableStyle
, XML_accent1
, XML_dk1
, XML_lt1
);
184 else if (styleId
== "{21E4AEA4-8DFA-4A89-87EB-49C32662AFE0}") //Medium Style 2 Accent 2
186 pTableStyle
= new TableStyle();
187 oox::drawingml::FillPropertiesPtr
pFstRowFillProperties( new oox::drawingml::FillProperties
);
188 pFstRowFillProperties
->moFillType
.set(XML_solidFill
);
189 pFstRowFillProperties
->maFillColor
.setSchemeClr(XML_accent2
);
190 pTableStyle
->getFirstRow().getFillProperties() = pFstRowFillProperties
;
192 ::oox::drawingml::Color fstRowTextColor
;
193 fstRowTextColor
.setSchemeClr(XML_lt1
);
194 pTableStyle
->getFirstRow().getTextColor() = fstRowTextColor
;
196 oox::drawingml::LinePropertiesPtr
pFstBottomBorder( new oox::drawingml::LineProperties
);
197 pFstBottomBorder
->moLineWidth
= 38100;
198 pFstBottomBorder
->moPresetDash
= XML_sng
;
199 pFstBottomBorder
->maLineFill
.moFillType
.set(XML_solidFill
);
200 pFstBottomBorder
->maLineFill
.maFillColor
.setSchemeClr(XML_lt1
);
201 pTableStyle
->getFirstRow().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_bottom
,pFstBottomBorder
));
203 pTableStyle
->getLastRow().getFillProperties() = pFstRowFillProperties
;
204 pTableStyle
->getLastRow().getTextColor() = fstRowTextColor
;
205 pTableStyle
->getLastRow().getLineBorders().insert(std::pair
<sal_Int32
, ::oox::drawingml::LinePropertiesPtr
>(XML_top
,pFstBottomBorder
));
207 pTableStyle
->getFirstCol().getFillProperties() = pFstRowFillProperties
;
208 pTableStyle
->getFirstCol().getTextColor() = fstRowTextColor
;
210 pTableStyle
->getLastCol().getFillProperties() = pFstRowFillProperties
;
211 pTableStyle
->getLastCol().getTextColor() = fstRowTextColor
;
213 SetTableStyleProperties(pTableStyle
, XML_accent2
, XML_dk1
, XML_lt1
);
215 else if (styleId
== "{C4B1156A-380E-4F78-BDF5-A606A8083BF9}") //Medium Style 4 Accent 4
217 pTableStyle
= new TableStyle();
218 SetTableStyleProperties(pTableStyle
, XML_accent4
, XML_dk1
, XML_accent4
);
224 const TableStyle
& TableProperties::getUsedTableStyle( const ::oox::core::XmlFilterBase
& rFilterBase
, TableStyle
*& rTableStyleToDelete
)
226 ::oox::core::XmlFilterBase
& rBase( const_cast< ::oox::core::XmlFilterBase
& >( rFilterBase
) );
228 TableStyle
* pTableStyle
= NULL
;
230 pTableStyle
= &*mpTableStyle
;
231 else if ( rBase
.getTableStyles() )
233 const std::vector
< TableStyle
>& rTableStyles( rBase
.getTableStyles()->getTableStyles() );
234 const OUString
aStyleId( getStyleId().isEmpty() ? rBase
.getTableStyles()->getDefaultStyleId() : getStyleId() );
235 std::vector
< TableStyle
>::const_iterator
aIter( rTableStyles
.begin() );
236 while( aIter
!= rTableStyles
.end() )
238 if ( const_cast< TableStyle
& >( *aIter
).getStyleId() == aStyleId
)
240 pTableStyle
= &const_cast< TableStyle
& >( *aIter
);
241 break; // we get the correct style
245 //if the pptx just has table style id, but no table style content, we will create the table style ourselves
248 rTableStyleToDelete
= CreateTableStyle(aStyleId
);
249 pTableStyle
= rTableStyleToDelete
;
254 return theDefaultTableStyle::get();
259 void TableProperties::pushToPropSet( const ::oox::core::XmlFilterBase
& rFilterBase
,
260 const Reference
< XPropertySet
>& xPropSet
, TextListStylePtr pMasterTextListStyle
)
262 uno::Reference
< XColumnRowRange
> xColumnRowRange(
263 xPropSet
->getPropertyValue("Model"), uno::UNO_QUERY_THROW
);
265 CreateTableColumns( xColumnRowRange
->getColumns(), mvTableGrid
);
266 CreateTableRows( xColumnRowRange
->getRows(), mvTableRows
);
268 TableStyle
* pTableStyleToDelete
= NULL
;
269 const TableStyle
& rTableStyle( getUsedTableStyle( rFilterBase
, pTableStyleToDelete
) );
271 const std::vector
< TableRow
>::const_iterator
aTableRowEnd( mvTableRows
.end() );
272 for (std::vector
< TableRow
>::iterator
aTableRowIter( mvTableRows
.begin() );
273 aTableRowIter
!= aTableRowEnd
; ++aTableRowIter
, ++nRow
)
275 sal_Int32 nColumn
= 0;
276 const std::vector
< TableCell
>::const_iterator
aTableCellEnd( aTableRowIter
->getTableCells().end() );
277 for (std::vector
< TableCell
>::iterator
aTableCellIter( aTableRowIter
->getTableCells().begin() );
278 aTableCellIter
!= aTableCellEnd
; ++aTableCellIter
, ++nColumn
)
280 TableCell
& rTableCell( *aTableCellIter
);
281 if ( !rTableCell
.getvMerge() && !rTableCell
.gethMerge() )
283 uno::Reference
< XTable
> xTable( xColumnRowRange
, uno::UNO_QUERY_THROW
);
284 if ( ( rTableCell
.getRowSpan() > 1 ) || ( rTableCell
.getGridSpan() > 1 ) )
285 MergeCells( xTable
, nColumn
, nRow
, rTableCell
.getGridSpan(), rTableCell
.getRowSpan() );
287 Reference
< XCellRange
> xCellRange( xTable
, UNO_QUERY_THROW
);
288 rTableCell
.pushToXCell( rFilterBase
, pMasterTextListStyle
, xCellRange
->getCellByPosition( nColumn
, nRow
), *this, rTableStyle
,
289 nColumn
, aTableRowIter
->getTableCells().size()-1, nRow
, mvTableRows
.size()-1 );
294 delete pTableStyleToDelete
;
299 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */