office-gobmx/oox/source/drawingml/textbodypropertiescontext.cxx
2012-02-14 19:50:40 +05:30

187 lines
7.7 KiB
C++

/* -*- 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 "oox/drawingml/textbodypropertiescontext.hxx"
//#include <com/sun/star/text/ControlCharacter.hpp>
#include <com/sun/star/text/WritingMode.hpp>
#include <com/sun/star/drawing/TextFitToSizeType.hpp>
#include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
#include "oox/drawingml/textbodyproperties.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
#include "oox/helper/attributelist.hxx"
#include "oox/helper/propertymap.hxx"
using ::rtl::OUString;
using namespace ::oox::core;
using namespace ::com::sun::star;
using namespace ::com::sun::star::drawing;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml::sax;
namespace oox { namespace drawingml {
// --------------------------------------------------------------------
// CT_TextBodyProperties
TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler& rParent,
const Reference< XFastAttributeList >& xAttributes, TextBodyProperties& rTextBodyProp )
: ContextHandler( rParent )
, mrTextBodyProp( rTextBodyProp )
{
AttributeList aAttribs( xAttributes );
// ST_TextWrappingType
sal_Int32 nWrappingType = aAttribs.getToken( XML_wrap, XML_square );
mrTextBodyProp.maPropertyMap[ PROP_TextWordWrap ] <<= static_cast< sal_Bool >( nWrappingType == XML_square );
// ST_Coordinate
OUString sValue;
sValue = xAttributes->getOptionalValue( XML_lIns );
if( !sValue.isEmpty() ) {
sal_Int32 nLeftInset = ( !sValue.isEmpty() ? GetCoordinate( sValue ) : 91440 / 360 );
mrTextBodyProp.maPropertyMap[ PROP_TextLeftDistance ] <<= static_cast< sal_Int32 >( nLeftInset );
}
sValue = xAttributes->getOptionalValue( XML_tIns );
if( !sValue.isEmpty() ) {
sal_Int32 nTopInset = ( !sValue.isEmpty() ? GetCoordinate( sValue ) : 91440 / 360 );
mrTextBodyProp.maPropertyMap[ PROP_TextUpperDistance ] <<= static_cast< sal_Int32 >( nTopInset );
}
sValue = xAttributes->getOptionalValue( XML_rIns );
if( !sValue.isEmpty() ) {
sal_Int32 nRightInset = ( !sValue.isEmpty() ? GetCoordinate( sValue ) : 91440 / 360 );
mrTextBodyProp.maPropertyMap[ PROP_TextRightDistance ] <<= static_cast< sal_Int32 >( nRightInset );
}
sValue = xAttributes->getOptionalValue( XML_bIns );
if( !sValue.isEmpty() ) {
sal_Int32 nBottonInset = ( !sValue.isEmpty() ? GetCoordinate( sValue ) : 45720 / 360 );
mrTextBodyProp.maPropertyMap[ PROP_TextLowerDistance ] <<= static_cast< sal_Int32 >( nBottonInset );
}
bool bAnchorCenter = aAttribs.getBool( XML_anchorCtr, false );
if( xAttributes->hasAttribute( XML_anchorCtr ) ) {
if( bAnchorCenter )
mrTextBodyProp.maPropertyMap[ PROP_TextHorizontalAdjust ] <<=
TextHorizontalAdjust_CENTER;
}
// bool bCompatLineSpacing = aAttribs.getBool( XML_compatLnSpc, false );
// bool bForceAA = aAttribs.getBool( XML_forceAA, false );
// bool bFromWordArt = aAttribs.getBool( XML_fromWordArt, false );
// ST_TextHorzOverflowType
// sal_Int32 nHorzOverflow = xAttributes->getOptionalValueToken( XML_horzOverflow, XML_overflow );
// ST_TextVertOverflowType
// sal_Int32 nVertOverflow = xAttributes->getOptionalValueToken( XML_vertOverflow, XML_overflow );
// ST_TextColumnCount
// sal_Int32 nNumCol = aAttribs.getInteger( XML_numCol, 1 );
// ST_Angle
mrTextBodyProp.moRotation = aAttribs.getInteger( XML_rot );
// bool bRtlCol = aAttribs.getBool( XML_rtlCol, false );
// ST_PositiveCoordinate
// sal_Int32 nSpcCol = aAttribs.getInteger( XML_spcCol, 0 );
// bool bSpcFirstLastPara = aAttribs.getBool( XML_spcFirstLastPara, 0 );
// bool bUpRight = aAttribs.getBool( XML_upright, 0 );
// ST_TextVerticalType
if( xAttributes->hasAttribute( XML_vert ) ) {
mrTextBodyProp.moVert = aAttribs.getToken( XML_vert );
bool bRtl = aAttribs.getBool( XML_rtl, false );
sal_Int32 tVert = mrTextBodyProp.moVert.get( XML_horz );
if( tVert == XML_vert || tVert == XML_eaVert || tVert == XML_vert270 || tVert == XML_mongolianVert )
mrTextBodyProp.moRotation = 5400000*(tVert==XML_vert270?3:1);
else
mrTextBodyProp.maPropertyMap[ PROP_TextWritingMode ]
<<= ( bRtl ? WritingMode_RL_TB : WritingMode_LR_TB );
}
// ST_TextAnchoringType
if( xAttributes->hasAttribute( XML_anchor ) ) {
switch( xAttributes->getOptionalValueToken( XML_anchor, XML_t ) )
{
case XML_b : mrTextBodyProp.meVA = drawing::TextVerticalAdjust_BOTTOM; break;
case XML_dist :
case XML_just :
case XML_ctr : mrTextBodyProp.meVA = drawing::TextVerticalAdjust_CENTER; break;
default:
case XML_t : mrTextBodyProp.meVA = drawing::TextVerticalAdjust_TOP; break;
}
mrTextBodyProp.maPropertyMap[ PROP_TextVerticalAdjust ] <<= mrTextBodyProp.meVA;
}
}
// --------------------------------------------------------------------
void TextBodyPropertiesContext::endFastElement( sal_Int32 ) throw (SAXException, RuntimeException)
{
}
// --------------------------------------------------------------------
Reference< XFastContextHandler > TextBodyPropertiesContext::createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& /*xAttributes*/) throw (SAXException, RuntimeException)
{
Reference< XFastContextHandler > xRet;
switch( aElementToken )
{
// Sequence
case A_TOKEN( prstTxWarp ): // CT_PresetTextShape
case A_TOKEN( prot ): // CT_TextProtectionProperty
break;
// EG_TextAutofit
case A_TOKEN( noAutofit ):
mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= false; // CT_TextNoAutofit
break;
case A_TOKEN( normAutofit ): // CT_TextNormalAutofit
mrTextBodyProp.maPropertyMap[ PROP_TextFitToSize ] <<= TextFitToSizeType_AUTOFIT;
mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= false;
break;
case A_TOKEN( spAutoFit ):
mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= true;
break;
case A_TOKEN( scene3d ): // CT_Scene3D
// EG_Text3D
case A_TOKEN( sp3d ): // CT_Shape3D
case A_TOKEN( flatTx ): // CT_FlatText
break;
}
return xRet;
}
// --------------------------------------------------------------------
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */