summaryrefslogtreecommitdiff
path: root/writerfilter/source/dmapper/TDefTableHandler.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/dmapper/TDefTableHandler.cxx')
-rw-r--r--writerfilter/source/dmapper/TDefTableHandler.cxx281
1 files changed, 281 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/TDefTableHandler.cxx b/writerfilter/source/dmapper/TDefTableHandler.cxx
new file mode 100644
index 000000000000..c0a2f9c8add6
--- /dev/null
+++ b/writerfilter/source/dmapper/TDefTableHandler.cxx
@@ -0,0 +1,281 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * 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 <TDefTableHandler.hxx>
+#include <PropertyMap.hxx>
+#include <ConversionHelper.hxx>
+#include <ooxml/resourceids.hxx>
+#include <doctok/resourceids.hxx>
+#include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/text/TableColumnSeparator.hpp>
+#include <com/sun/star/text/VertOrientation.hpp>
+
+#include "dmapperLoggers.hxx"
+
+namespace writerfilter {
+namespace dmapper {
+
+using namespace ::com::sun::star;
+
+
+
+TDefTableHandler::TDefTableHandler(bool bOOXML) :
+LoggedProperties(dmapper_logger, "TDefTableHandler"),
+m_nLineWidth(0),
+m_nLineType(0),
+m_nLineColor(0),
+m_nLineDistance(0),
+m_bOOXML( bOOXML )
+{
+}
+
+
+TDefTableHandler::~TDefTableHandler()
+{
+}
+
+
+void TDefTableHandler::lcl_attribute(Id rName, Value & rVal)
+{
+ sal_Int32 nIntValue = rVal.getInt();
+ (void)nIntValue;
+ (void)rName;
+ switch( rName )
+ {
+ case NS_rtf::LN_cellx:
+ // nIntValue contains the vert. line position
+ //TODO: nIntValue is wrong for negative values!
+ if( nIntValue > 0x7fff )
+ nIntValue -= 0xffff;
+ m_aCellBorderPositions.push_back( ConversionHelper::convertTwipToMM100( nIntValue ) );
+ break;
+ case NS_rtf::LN_tc:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rVal.getProperties();
+ if( pProperties.get())
+ {
+ pProperties->resolve( *this );
+ }
+ }
+ break;
+ //from LN_tc
+ case NS_rtf::LN_FFIRSTMERGED:
+ case NS_rtf::LN_FMERGED:
+ case NS_rtf::LN_FVERTICAL:
+ case NS_rtf::LN_FBACKWARD:
+ case NS_rtf::LN_FROTATEFONT:
+ case NS_rtf::LN_FVERTMERGE:
+ case NS_rtf::LN_FVERTRESTART:
+ break;
+ case NS_rtf::LN_VERTALIGN:
+ //TODO: m_aCellVertAlign is just a temporary solution! 0 - top 1 - center 2 - bottom
+ m_aCellVertAlign.push_back( nIntValue );
+ break;
+ case NS_rtf::LN_FUNUSED:
+ case NS_rtf::LN_CellPrefferedSize:
+ break;
+ case NS_rtf::LN_BRCTOP:
+ case NS_rtf::LN_BRCLEFT:
+ case NS_rtf::LN_BRCBOTTOM:
+ case NS_rtf::LN_BRCRIGHT:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rVal.getProperties();
+ localResolve( rName, pProperties );
+ }
+ break;
+ //from LN_BRCXXXX - handled within the BorderHandler
+ case NS_rtf::LN_DPTLINEWIDTH: // 0x2871
+ // width of a single line in 1/8 pt, max of 32 pt -> twip * 5 / 2.
+ m_nLineWidth = ConversionHelper::convertTwipToMM100( nIntValue * 5 / 2 );
+ break;
+ case NS_rtf::LN_BRCTYPE: // 0x2872
+ m_nLineType = nIntValue;
+ break;
+ case NS_ooxml::LN_CT_Border_color:
+ case NS_rtf::LN_ICO: // 0x2873
+ m_nLineColor = nIntValue;
+ break;
+ case NS_rtf::LN_DPTSPACE: // 0x2874
+ m_nLineDistance = nIntValue;
+ break;
+ case NS_rtf::LN_FSHADOW: // 0x2875
+ //if 1 then line has shadow - unsupported
+ case NS_rtf::LN_FFRAME: // 0x2876
+ case NS_rtf::LN_UNUSED2_15: // 0x2877
+ // ignored
+ break;
+ case NS_ooxml::LN_CT_Border_themeColor:
+ case NS_ooxml::LN_CT_Border_themeTint:
+ case NS_ooxml::LN_CT_Border_themeShade:
+ // ignored
+ break;
+ default:
+ OSL_FAIL("unknown attribute");
+ }
+}
+
+
+void TDefTableHandler::localResolve(Id rName, writerfilter::Reference<Properties>::Pointer_t pProperties)
+{
+ if( pProperties.get())
+ {
+ m_nLineWidth = m_nLineType = m_nLineColor = m_nLineDistance = 0;
+ pProperties->resolve( *this );
+ table::BorderLine2 aBorderLine;
+ ConversionHelper::MakeBorderLine( m_nLineWidth, m_nLineType, m_nLineColor,
+ aBorderLine, m_bOOXML );
+
+ switch( rName )
+ {
+ case NS_ooxml::LN_CT_TcBorders_top:
+ case NS_rtf::LN_BRCTOP:
+ m_aTopBorderLines.push_back(aBorderLine);
+ break;
+ case NS_ooxml::LN_CT_TcBorders_left:
+ case NS_rtf::LN_BRCLEFT:
+ m_aLeftBorderLines.push_back(aBorderLine);
+ break;
+ case NS_ooxml::LN_CT_TcBorders_bottom:
+ case NS_rtf::LN_BRCBOTTOM:
+ m_aBottomBorderLines.push_back(aBorderLine);
+ break;
+ case NS_ooxml::LN_CT_TcBorders_right:
+ case NS_rtf::LN_BRCRIGHT:
+ m_aRightBorderLines.push_back(aBorderLine);
+ break;
+ case NS_ooxml::LN_CT_TcBorders_insideH:
+ m_aInsideHBorderLines.push_back(aBorderLine);
+ break;
+ case NS_ooxml::LN_CT_TcBorders_insideV:
+ m_aInsideVBorderLines.push_back(aBorderLine);
+ break;
+ default:;
+ }
+ }
+}
+
+
+void TDefTableHandler::lcl_sprm(Sprm & rSprm)
+{
+ switch( rSprm.getId() )
+ {
+ case NS_ooxml::LN_CT_TcBorders_top:
+ case NS_ooxml::LN_CT_TcBorders_left:
+ case NS_ooxml::LN_CT_TcBorders_bottom:
+ case NS_ooxml::LN_CT_TcBorders_right:
+ case NS_ooxml::LN_CT_TcBorders_insideH:
+ case NS_ooxml::LN_CT_TcBorders_insideV:
+ case NS_ooxml::LN_CT_TcBorders_tl2br:
+ case NS_ooxml::LN_CT_TcBorders_tr2bl:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+ localResolve( rSprm.getId(), pProperties );
+ }
+ break;
+ default:;
+ }
+}
+
+
+PropertyMapPtr TDefTableHandler::getRowProperties() const
+{
+ PropertyMapPtr pPropertyMap(new PropertyMap);
+
+ // Writer only wants the separators, Word provides also the outer border positions
+ if( m_aCellBorderPositions.size() > 2 )
+ {
+ //determine table width
+ double nFullWidth = m_aCellBorderPositions[m_aCellBorderPositions.size() - 1] - m_aCellBorderPositions[0];
+ //the positions have to be distibuted in a range of 10000
+ const double nFullWidthRelative = 10000.;
+ uno::Sequence< text::TableColumnSeparator > aSeparators( m_aCellBorderPositions.size() - 2 );
+ text::TableColumnSeparator* pSeparators = aSeparators.getArray();
+ for( sal_uInt32 nBorder = 1; nBorder < m_aCellBorderPositions.size() - 1; ++nBorder )
+ {
+ sal_Int16 nRelPos =
+ sal::static_int_cast< sal_Int16 >(double(m_aCellBorderPositions[nBorder]) * nFullWidthRelative / nFullWidth );
+
+ pSeparators[nBorder - 1].Position = nRelPos;
+ pSeparators[nBorder - 1].IsVisible = sal_True;
+ }
+ pPropertyMap->Insert( PROP_TABLE_COLUMN_SEPARATORS, false, uno::makeAny( aSeparators ) );
+ }
+
+ return pPropertyMap;
+}
+
+
+void TDefTableHandler::fillCellProperties(
+ size_t nCell, ::boost::shared_ptr< TablePropertyMap > pCellProperties ) const
+{
+ if( m_aCellBorderPositions.size() > nCell )
+ {
+ sal_Int16 nVertOrient = text::VertOrientation::NONE;
+ switch( m_aCellVertAlign[nCell] ) //0 - top 1 - center 2 - bottom
+ {
+ case 1: nVertOrient = text::VertOrientation::CENTER; break;
+ case 2: nVertOrient = text::VertOrientation::BOTTOM; break;
+ default:;
+ }
+ pCellProperties->Insert( PROP_VERT_ORIENT, false, uno::makeAny( nVertOrient ) );
+ }
+ if( m_aTopBorderLines.size() > nCell )
+ pCellProperties->Insert( PROP_TOP_BORDER, false, uno::makeAny( m_aTopBorderLines[nCell] ) );
+ if( m_aLeftBorderLines.size() > nCell )
+ pCellProperties->Insert( PROP_LEFT_BORDER, false, uno::makeAny( m_aLeftBorderLines[nCell] ) );
+ if( m_aBottomBorderLines.size() > nCell )
+ pCellProperties->Insert( PROP_BOTTOM_BORDER, false, uno::makeAny( m_aBottomBorderLines[nCell] ) );
+ if( m_aRightBorderLines.size() > nCell )
+ pCellProperties->Insert( PROP_RIGHT_BORDER, false, uno::makeAny( m_aRightBorderLines[nCell] ) );
+ if( m_aInsideHBorderLines.size() > nCell )
+ pCellProperties->Insert( META_PROP_HORIZONTAL_BORDER, false, uno::makeAny( m_aInsideHBorderLines[nCell] ) );
+ if( m_aInsideVBorderLines.size() > nCell )
+ pCellProperties->Insert( META_PROP_VERTICAL_BORDER, false, uno::makeAny( m_aInsideVBorderLines[nCell] ) );
+}
+
+
+sal_Int32 TDefTableHandler::getTableWidth() const
+{
+ sal_Int32 nWidth = 0;
+ if( m_aCellBorderPositions.size() > 1 )
+ {
+ //determine table width
+ nWidth = m_aCellBorderPositions[m_aCellBorderPositions.size() - 1] - m_aCellBorderPositions[0];
+ }
+ return nWidth;
+}
+
+
+size_t TDefTableHandler::getCellCount() const
+{
+ return m_aCellVertAlign.size();
+}
+
+} //namespace dmapper
+} //namespace writerfilter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */