summaryrefslogtreecommitdiff
path: root/oox/source/drawingml/table/tableproperties.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'oox/source/drawingml/table/tableproperties.cxx')
-rw-r--r--oox/source/drawingml/table/tableproperties.cxx180
1 files changed, 180 insertions, 0 deletions
diff --git a/oox/source/drawingml/table/tableproperties.cxx b/oox/source/drawingml/table/tableproperties.cxx
new file mode 100644
index 000000000000..136754fbccc3
--- /dev/null
+++ b/oox/source/drawingml/table/tableproperties.cxx
@@ -0,0 +1,180 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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/namespaces.hxx"
+#include "oox/core/xmlfilterbase.hxx"
+#include "oox/helper/propertyset.hxx"
+#include "tokens.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();
+
+const TableStyle& TableProperties::getUsedTableStyle( const ::oox::core::XmlFilterBase& rFilterBase )
+{
+ ::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 ( !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 );
+
+ const TableStyle& rTableStyle( getUsedTableStyle( rFilterBase ) );
+ 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++;
+ }
+}
+
+} } }