blob: bd664654950278458757655fb19e49a002759ee2 [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 <TDefTableHandler.hxx>
#include <PropertyMap.hxx>
#include <ConversionHelper.hxx>
#include <ooxml/resourceids.hxx>
#include <doctok/resourceids.hxx>
#include <com/sun/star/table/BorderLine.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;
/*-- 24.04.2007 09:06:35---------------------------------------------------
-----------------------------------------------------------------------*/
TDefTableHandler::TDefTableHandler(bool bOOXML) :
LoggedProperties(dmapper_logger, "TDefTableHandler"),
m_nLineWidth(0),
m_nLineType(0),
m_nLineColor(0),
m_nLineDistance(0),
m_bOOXML( bOOXML )
{
}
/*-- 24.04.2007 09:06:35---------------------------------------------------
-----------------------------------------------------------------------*/
TDefTableHandler::~TDefTableHandler()
{
}
/*-- 24.04.2007 09:06:35---------------------------------------------------
-----------------------------------------------------------------------*/
void TDefTableHandler::lcl_attribute(Id rName, Value & rVal)
{
sal_Int32 nIntValue = rVal.getInt();
(void)nIntValue;
(void)rName;
/* WRITERFILTERSTATUS: table: TDefTable_attributedata */
switch( rName )
{
/* WRITERFILTERSTATUS: done: 50, planned: 0, spent: 0 */
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;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_tc:
{
writerfilter::Reference<Properties>::Pointer_t pProperties = rVal.getProperties();
if( pProperties.get())
{
pProperties->resolve( *this );
}
}
break;
//from LN_tc
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FFIRSTMERGED:
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FMERGED:
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FVERTICAL:
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FBACKWARD:
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FROTATEFONT:
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FVERTMERGE:
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FVERTRESTART:
break;
/* WRITERFILTERSTATUS: done: 50, planned: 0, spent: 0 */
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;
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FUNUSED:
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_CellPrefferedSize:
break;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCTOP:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCLEFT:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCBOTTOM:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCRIGHT:
{
writerfilter::Reference<Properties>::Pointer_t pProperties = rVal.getProperties();
localResolve( rName, pProperties );
}
break;
//from LN_BRCXXXX - handled within the BorderHandler
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
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;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCTYPE: // 0x2872
m_nLineType = nIntValue;
break;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_Border_color:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_ICO: // 0x2873
m_nLineColor = nIntValue;
break;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_DPTSPACE: // 0x2874
m_nLineDistance = nIntValue;
break;
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FSHADOW: // 0x2875
//if 1 then line has shadow - unsupported
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
case NS_rtf::LN_FFRAME: // 0x2876
/* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */
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_ENSURE(false, "unknown attribute");
}
}
/*-- 08.10.2007 12:55:32---------------------------------------------------
-----------------------------------------------------------------------*/
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::BorderLine aBorderLine;
ConversionHelper::MakeBorderLine( m_nLineWidth, m_nLineType, m_nLineColor,
aBorderLine, m_bOOXML );
/* WRITERFILTERSTATUS: table: TDefTable_localresolve */
switch( rName )
{
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_TcBorders_top:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCTOP:
m_aTopBorderLines.push_back(aBorderLine);
break;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_TcBorders_left:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCLEFT:
m_aLeftBorderLines.push_back(aBorderLine);
break;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_TcBorders_bottom:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_rtf::LN_BRCBOTTOM:
m_aBottomBorderLines.push_back(aBorderLine);
break;
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_TcBorders_right:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
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:;
}
}
}
/*-- 24.04.2007 09:06:35---------------------------------------------------
-----------------------------------------------------------------------*/
void TDefTableHandler::lcl_sprm(Sprm & rSprm)
{
/* WRITERFILTERSTATUS: table: TDefTable_sprm */
switch( rSprm.getId() )
{
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_TcBorders_top:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_TcBorders_left:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
case NS_ooxml::LN_CT_TcBorders_bottom:
/* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
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:;
}
}
/*-- 24.04.2007 09:09:01---------------------------------------------------
-----------------------------------------------------------------------*/
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;
}
/*-- 10.05.2007 16:10:33---------------------------------------------------
-----------------------------------------------------------------------*/
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] ) );
}
/*-- 09.05.2007 13:14:17---------------------------------------------------
-----------------------------------------------------------------------*/
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;
}
/*-- 10.05.2007 16:09:10---------------------------------------------------
-----------------------------------------------------------------------*/
size_t TDefTableHandler::getCellCount() const
{
return m_aCellVertAlign.size();
}
} //namespace dmapper
} //namespace writerfilter