1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #include "oox/drawingml/textbodypropertiescontext.hxx"
29 
30 #include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
31 #include <com/sun/star/text/ControlCharacter.hpp>
32 #include <com/sun/star/text/WritingMode.hpp>
33 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
34 #include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
35 #include "oox/drawingml/textbodyproperties.hxx"
36 #include "oox/drawingml/drawingmltypes.hxx"
37 #include "oox/helper/attributelist.hxx"
38 #include "oox/helper/propertymap.hxx"
39 
40 using ::rtl::OUString;
41 using namespace ::oox::core;
42 using namespace ::com::sun::star;
43 using namespace ::com::sun::star::drawing;
44 using namespace ::com::sun::star::text;
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::xml::sax;
47 
48 namespace oox { namespace drawingml {
49 
50 // --------------------------------------------------------------------
51 
52 // CT_TextBodyProperties
53 TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler& rParent,
54     const Reference< XFastAttributeList >& xAttributes, TextBodyProperties& rTextBodyProp )
55 : ContextHandler( rParent )
56 , mrTextBodyProp( rTextBodyProp )
57 {
58     AttributeList aAttribs( xAttributes );
59 
60 	// ST_TextWrappingType
61     sal_Int32 nWrappingType = aAttribs.getToken( XML_wrap, XML_square );
62     mrTextBodyProp.maPropertyMap[ PROP_TextWordWrap ] <<= static_cast< sal_Bool >( nWrappingType == XML_square );
63 
64 	// ST_Coordinate
65 	OUString sValue;
66 	sValue = xAttributes->getOptionalValue( XML_lIns );
67     if( sValue.getLength() ) {
68 	sal_Int32 nLeftInset = ( sValue.getLength() != 0 ? GetCoordinate(  sValue ) : 91440 / 360 );
69 	mrTextBodyProp.maPropertyMap[ PROP_TextLeftDistance ]  <<= static_cast< sal_Int32 >( nLeftInset );
70     }
71 	sValue = xAttributes->getOptionalValue( XML_tIns );
72     if( sValue.getLength() ) {
73 	sal_Int32 nTopInset  = ( sValue.getLength() != 0 ? GetCoordinate(  sValue ) : 91440 / 360 );
74 	mrTextBodyProp.maPropertyMap[ PROP_TextUpperDistance ] <<= static_cast< sal_Int32 >( nTopInset );
75     }
76 	sValue = xAttributes->getOptionalValue( XML_rIns );
77     if( sValue.getLength() ) {
78 	sal_Int32 nRightInset  = ( sValue.getLength() != 0 ? GetCoordinate(  sValue ) : 91440 / 360 );
79 	mrTextBodyProp.maPropertyMap[ PROP_TextRightDistance ] <<= static_cast< sal_Int32 >( nRightInset );
80     }
81 	sValue = xAttributes->getOptionalValue( XML_bIns );
82     if( sValue.getLength() ) {
83 	sal_Int32 nBottonInset = ( sValue.getLength() != 0 ? GetCoordinate(  sValue ) : 45720 / 360 );
84 	mrTextBodyProp.maPropertyMap[ PROP_TextLowerDistance ] <<= static_cast< sal_Int32 >( nBottonInset );
85     }
86 
87 	// ST_TextAnchoringType
88 	drawing::TextVerticalAdjust	eVA( drawing::TextVerticalAdjust_TOP );
89 	switch( xAttributes->getOptionalValueToken( XML_anchor, XML_t ) )
90 	{
91 		case XML_b :	eVA = drawing::TextVerticalAdjust_BOTTOM; break;
92 		case XML_dist :
93 		case XML_just :
94 		case XML_ctr :	eVA = drawing::TextVerticalAdjust_CENTER; break;
95 		default:
96 		case XML_t :	eVA = drawing::TextVerticalAdjust_TOP; break;
97 	}
98 	mrTextBodyProp.maPropertyMap[ PROP_TextVerticalAdjust ] <<= eVA;
99 
100     bool bAnchorCenter = aAttribs.getBool( XML_anchorCtr, false );
101     if( bAnchorCenter )
102 	mrTextBodyProp.maPropertyMap[ PROP_TextHorizontalAdjust ] <<=
103 	    TextHorizontalAdjust_CENTER;
104 
105 //   bool bCompatLineSpacing = aAttribs.getBool( XML_compatLnSpc, false );
106 //   bool bForceAA = aAttribs.getBool( XML_forceAA, false );
107 //   bool bFromWordArt = aAttribs.getBool( XML_fromWordArt, false );
108 
109   // ST_TextHorzOverflowType
110 //   sal_Int32 nHorzOverflow = xAttributes->getOptionalValueToken( XML_horzOverflow, XML_overflow );
111 	// ST_TextVertOverflowType
112 //   sal_Int32 nVertOverflow =  xAttributes->getOptionalValueToken( XML_vertOverflow, XML_overflow );
113 
114 	// ST_TextColumnCount
115 //   sal_Int32 nNumCol = aAttribs.getInteger( XML_numCol, 1 );
116 
117     // ST_Angle
118     mrTextBodyProp.moRotation = aAttribs.getInteger( XML_rot );
119 
120 //   bool bRtlCol = aAttribs.getBool( XML_rtlCol, false );
121 	// ST_PositiveCoordinate
122 //   sal_Int32 nSpcCol = aAttribs.getInteger( XML_spcCol, 0 );
123 //   bool bSpcFirstLastPara = aAttribs.getBool( XML_spcFirstLastPara, 0 );
124 //   bool bUpRight = aAttribs.getBool( XML_upright, 0 );
125 
126 	// ST_TextVerticalType
127     mrTextBodyProp.moVert = aAttribs.getToken( XML_vert );
128     bool bRtl = aAttribs.getBool( XML_rtl, false );
129     sal_Int32 tVert = mrTextBodyProp.moVert.get( XML_horz );
130     if( tVert == XML_vert || tVert == XML_eaVert || tVert == XML_vert270 || tVert == XML_mongolianVert ) {
131       mrTextBodyProp.maPropertyMap[ PROP_TextWritingMode ]
132 	<<= WritingMode_TB_RL;
133       // workaround for TB_LR as using WritingMode2 doesn't work
134     	if( !bAnchorCenter )
135     	    mrTextBodyProp.maPropertyMap[ PROP_TextHorizontalAdjust ] <<=
136     		TextHorizontalAdjust_LEFT;
137     } else
138       mrTextBodyProp.maPropertyMap[ PROP_TextWritingMode ]
139 	<<= ( bRtl ? WritingMode_RL_TB : WritingMode_LR_TB );
140 }
141 
142 // --------------------------------------------------------------------
143 
144 void TextBodyPropertiesContext::endFastElement( sal_Int32 ) throw (SAXException, RuntimeException)
145 {
146 }
147 
148 // --------------------------------------------------------------------
149 
150 Reference< XFastContextHandler > TextBodyPropertiesContext::createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& /*xAttributes*/) throw (SAXException, RuntimeException)
151 {
152 	Reference< XFastContextHandler > xRet;
153 	switch( aElementToken )
154 	{
155 			// Sequence
156 			case A_TOKEN( prstTxWarp ):		// CT_PresetTextShape
157 			case A_TOKEN( prot ):			// CT_TextProtectionProperty
158 				break;
159 
160 			// EG_TextAutofit
161 			case A_TOKEN( noAutofit ):
162                 mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= false;   // CT_TextNoAutofit
163 				break;
164 			case A_TOKEN( normAutofit ):	// CT_TextNormalAutofit
165                 mrTextBodyProp.maPropertyMap[ PROP_TextFitToSize ] <<= true;
166                 mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= false;
167                 break;
168 			case A_TOKEN( spAutoFit ):
169                 mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= true;
170 				break;
171 
172 			case A_TOKEN( scene3d ):		// CT_Scene3D
173 
174 			// EG_Text3D
175 			case A_TOKEN( sp3d ):			// CT_Shape3D
176 			case A_TOKEN( flatTx ):			// CT_FlatText
177 
178 				break;
179 	}
180 
181 	return xRet;
182 }
183 
184 // --------------------------------------------------------------------
185 
186 } }
187 
188