1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <xmloff/controlpropertyhdl.hxx>
27 #include <com/sun/star/awt/TextAlign.hpp>
28 #include <com/sun/star/awt/FontWidth.hpp>
29 #include <com/sun/star/awt/FontEmphasisMark.hpp>
30 #include <xmloff/xmltypes.hxx>
31 #include "xmloff/NamedBoolPropertyHdl.hxx"
32 #include "formenums.hxx"
33 #include <xmloff/xmluconv.hxx>
34 #include <xmloff/xmltoken.hxx>
35 #include <rtl/ustrbuf.hxx>
36 #include <osl/diagnose.h>
37 #include "callbacks.hxx"
38 #include <xmloff/XMLConstantsPropertyHandler.hxx>
39 
40 //.........................................................................
41 namespace xmloff
42 {
43 //.........................................................................
44 
45 	using namespace ::com::sun::star::uno;
46 	using namespace ::com::sun::star::awt;
47 	using namespace ::com::sun::star::beans;
48 	using namespace ::xmloff::token;
49 
50 	//=====================================================================
51 	//= OControlPropertyHandlerFactory
52 	//=====================================================================
53 	//---------------------------------------------------------------------
OControlPropertyHandlerFactory()54 	OControlPropertyHandlerFactory::OControlPropertyHandlerFactory()
55 		:m_pTextAlignHandler(NULL)
56 		,m_pControlBorderStyleHandler(NULL)
57         ,m_pControlBorderColorHandler(NULL)
58 		,m_pRotationAngleHandler(NULL)
59 		,m_pFontWidthHandler(NULL)
60 		,m_pFontEmphasisHandler(NULL)
61 		,m_pFontReliefHandler(NULL)
62 	{
63 	}
64 
65 	//---------------------------------------------------------------------
~OControlPropertyHandlerFactory()66 	OControlPropertyHandlerFactory::~OControlPropertyHandlerFactory()
67 	{
68 		delete m_pTextAlignHandler;
69 		delete m_pControlBorderStyleHandler;
70         delete m_pControlBorderColorHandler;
71 		delete m_pRotationAngleHandler;
72 		delete m_pFontWidthHandler;
73 		delete m_pFontEmphasisHandler;
74 		delete m_pFontReliefHandler;
75 	}
76 
77 	//---------------------------------------------------------------------
GetPropertyHandler(sal_Int32 _nType) const78 	const XMLPropertyHandler* OControlPropertyHandlerFactory::GetPropertyHandler(sal_Int32 _nType) const
79 	{
80 		const XMLPropertyHandler* pHandler = NULL;
81 
82 		switch (_nType)
83 		{
84 			case XML_TYPE_TEXT_ALIGN:
85 				if (!m_pTextAlignHandler)
86 					m_pTextAlignHandler = new XMLConstantsPropertyHandler(OEnumMapper::getEnumMap(OEnumMapper::epTextAlign), XML_TOKEN_INVALID );
87 				pHandler = m_pTextAlignHandler;
88 				break;
89 
90 			case XML_TYPE_CONTROL_BORDER:
91 				if (!m_pControlBorderStyleHandler)
92                     m_pControlBorderStyleHandler = new OControlBorderHandler( OControlBorderHandler::STYLE );
93 				pHandler = m_pControlBorderStyleHandler;
94 				break;
95 
96 			case XML_TYPE_CONTROL_BORDER_COLOR:
97 				if ( !m_pControlBorderColorHandler )
98 					m_pControlBorderColorHandler = new OControlBorderHandler( OControlBorderHandler::COLOR );
99 				pHandler = m_pControlBorderColorHandler;
100 				break;
101 
102 			case XML_TYPE_ROTATION_ANGLE:
103 				if (!m_pRotationAngleHandler)
104 					m_pRotationAngleHandler = new ORotationAngleHandler;
105 				pHandler = m_pRotationAngleHandler;
106 				break;
107 
108 			case XML_TYPE_FONT_WIDTH:
109 				if (!m_pFontWidthHandler)
110 					m_pFontWidthHandler = new OFontWidthHandler;
111 				pHandler = m_pFontWidthHandler;
112 				break;
113 
114 			case XML_TYPE_CONTROL_TEXT_EMPHASIZE:
115 				if (!m_pFontEmphasisHandler)
116 					m_pFontEmphasisHandler = new XMLConstantsPropertyHandler( OEnumMapper::getEnumMap(OEnumMapper::epFontEmphasis), XML_NONE );
117 				pHandler = m_pFontEmphasisHandler;
118 				break;
119 
120 			case XML_TYPE_TEXT_FONT_RELIEF:
121 				if (!m_pFontReliefHandler)
122 					m_pFontReliefHandler = new XMLConstantsPropertyHandler( OEnumMapper::getEnumMap(OEnumMapper::epFontRelief), XML_NONE );
123 				pHandler = m_pFontReliefHandler;
124 				break;
125             case XML_TYPE_TEXT_LINE_MODE:
126 		        pHandler = new XMLNamedBoolPropertyHdl(
127 									        ::xmloff::token::XML_SKIP_WHITE_SPACE,
128                                             ::xmloff::token::XML_CONTINUOUS);
129 		        break;
130 		}
131 
132 		if (!pHandler)
133 			pHandler = XMLPropertyHandlerFactory::GetPropertyHandler(_nType);
134 		return pHandler;
135 	}
136 
137 	//=====================================================================
138 	//= OControlTextEmphasisHandler
139 	//=====================================================================
OControlTextEmphasisHandler()140 	OControlTextEmphasisHandler::OControlTextEmphasisHandler()
141 	{
142 	}
143 
144 	//---------------------------------------------------------------------
exportXML(::rtl::OUString & _rStrExpValue,const Any & _rValue,const SvXMLUnitConverter &) const145 	sal_Bool OControlTextEmphasisHandler::exportXML( ::rtl::OUString& _rStrExpValue, const Any& _rValue, const SvXMLUnitConverter& ) const
146 	{
147 		::rtl::OUStringBuffer aReturn;
148 		sal_Bool bSuccess = sal_False;
149 		sal_Int16 nFontEmphasis = sal_Int16();
150 		if (_rValue >>= nFontEmphasis)
151 		{
152 			// the type
153 			sal_Int16 nType = nFontEmphasis & ~(FontEmphasisMark::ABOVE | FontEmphasisMark::BELOW);
154 			// the position of the mark
155 			sal_Bool bBelow = 0 != (nFontEmphasis & FontEmphasisMark::BELOW);
156 
157 			// convert
158             bSuccess = SvXMLUnitConverter::convertEnum(aReturn, nType, OEnumMapper::getEnumMap(OEnumMapper::epFontEmphasis), XML_NONE);
159 			if (bSuccess)
160 			{
161 				aReturn.append( (sal_Unicode)' ' );
162 				aReturn.append( GetXMLToken(bBelow ? XML_BELOW : XML_ABOVE) );
163 
164 				_rStrExpValue = aReturn.makeStringAndClear();
165 			}
166 		}
167 
168 		return bSuccess;
169 	}
170 
171 	//---------------------------------------------------------------------
importXML(const::rtl::OUString & _rStrImpValue,Any & _rValue,const SvXMLUnitConverter &) const172 	sal_Bool OControlTextEmphasisHandler::importXML( const ::rtl::OUString& _rStrImpValue, Any& _rValue, const SvXMLUnitConverter& ) const
173 	{
174 		sal_Bool bSuccess = sal_True;
175 		sal_uInt16 nEmphasis = FontEmphasisMark::NONE;
176 
177 		sal_Bool bBelow = sal_False;
178 		sal_Bool bHasPos = sal_False, bHasType = sal_False;
179 
180 		::rtl::OUString sToken;
181 		SvXMLTokenEnumerator aTokenEnum(_rStrImpValue);
182 		while (aTokenEnum.getNextToken(sToken))
183 		{
184 			if (!bHasPos)
185 			{
186 				if (IsXMLToken(sToken, XML_ABOVE))
187 				{
188 					bBelow = sal_False;
189 					bHasPos = sal_True;
190 				}
191 				else if (IsXMLToken(sToken, XML_BELOW))
192 				{
193 					bBelow = sal_True;
194 					bHasPos = sal_True;
195 				}
196 			}
197 			if (!bHasType)
198 			{
199 				if (SvXMLUnitConverter::convertEnum(nEmphasis, sToken, OEnumMapper::getEnumMap(OEnumMapper::epFontEmphasis)))
200 				{
201 					bHasType = sal_True;
202 				}
203 				else
204 				{
205 					bSuccess = sal_False;
206 					break;
207 				}
208 			}
209 		}
210 
211 		if (bSuccess)
212 		{
213 			nEmphasis |= bBelow ? FontEmphasisMark::BELOW : FontEmphasisMark::ABOVE;
214 			_rValue <<= (sal_Int16)nEmphasis;
215 		}
216 
217 		return bSuccess;
218 	}
219 
220 	//=====================================================================
221 	//= OControlBorderHandlerBase
222 	//=====================================================================
223 	//---------------------------------------------------------------------
OControlBorderHandler(const OControlBorderHandler::BorderFacet _eFacet)224 	OControlBorderHandler::OControlBorderHandler( const OControlBorderHandler::BorderFacet _eFacet )
225         :m_eFacet( _eFacet )
226 	{
227 	}
228 
229 	//---------------------------------------------------------------------
importXML(const::rtl::OUString & _rStrImpValue,Any & _rValue,const SvXMLUnitConverter &) const230 	sal_Bool OControlBorderHandler::importXML( const ::rtl::OUString& _rStrImpValue, Any& _rValue, const SvXMLUnitConverter& ) const
231 	{
232 		::rtl::OUString sToken;
233 		SvXMLTokenEnumerator aTokens(_rStrImpValue);
234 
235 		sal_uInt16 nStyle = 1;
236         Color aColor;
237 
238 		while	(	aTokens.getNextToken(sToken)	// have a new token
239 				&&	(0 != sToken.getLength())		// really have a new token
240 				)
241 		{
242             // try interpreting the token as border style
243             if ( m_eFacet == STYLE )
244             {
245                 // is it a valid enum value?
246 			    if ( SvXMLUnitConverter::convertEnum( nStyle, sToken, OEnumMapper::getEnumMap( OEnumMapper::epBorderWidth ) ) )
247                 {
248                     _rValue <<= nStyle;
249                     return sal_True;
250                 }
251             }
252 
253             // try interpreting it as color value
254             if ( m_eFacet == COLOR )
255             {
256                 if ( SvXMLUnitConverter::convertColor( aColor, sToken ) )
257                 {
258                     _rValue <<= (sal_Int32)aColor.GetColor();
259                     return sal_True;
260                 }
261             }
262 		}
263 
264 		return sal_False;
265 	}
266 
267 	//---------------------------------------------------------------------
exportXML(::rtl::OUString & _rStrExpValue,const Any & _rValue,const SvXMLUnitConverter &) const268 	sal_Bool OControlBorderHandler::exportXML( ::rtl::OUString& _rStrExpValue, const Any& _rValue, const SvXMLUnitConverter& ) const
269 	{
270 		sal_Bool bSuccess = sal_False;
271 
272 	    ::rtl::OUStringBuffer aOut;
273         switch ( m_eFacet )
274         {
275         case STYLE:
276         {
277 		    sal_Int16 nBorder = 0;
278 		    bSuccess =	(_rValue >>= nBorder)
279 			    	&&	SvXMLUnitConverter::convertEnum( aOut, nBorder, OEnumMapper::getEnumMap( OEnumMapper::epBorderWidth ) );
280         }
281         break;
282         case COLOR:
283         {
284 		    sal_Int32 nBorderColor = 0;
285 		    if ( _rValue >>= nBorderColor )
286             {
287                 SvXMLUnitConverter::convertColor( aOut, Color( nBorderColor ) );
288                 bSuccess = sal_True;
289             }
290         }
291         break;
292         }   // switch ( m_eFacet )
293 
294         if ( !bSuccess )
295             return sal_False;
296 
297         if ( _rStrExpValue.getLength() )
298             _rStrExpValue += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " " ) );
299 		_rStrExpValue += aOut.makeStringAndClear();
300 
301 		return sal_True;
302     }
303 
304 	//=====================================================================
305 	//= OFontWidthHandler
306 	//=====================================================================
307 	//---------------------------------------------------------------------
OFontWidthHandler()308 	OFontWidthHandler::OFontWidthHandler()
309 	{
310 	}
311 
312 	//---------------------------------------------------------------------
importXML(const::rtl::OUString & _rStrImpValue,Any & _rValue,const SvXMLUnitConverter &) const313 	sal_Bool OFontWidthHandler::importXML( const ::rtl::OUString& _rStrImpValue, Any& _rValue, const SvXMLUnitConverter& ) const
314 	{
315 		sal_Int32 nWidth = 0;
316 		sal_Bool bSuccess = SvXMLUnitConverter::convertMeasure(nWidth, _rStrImpValue, MAP_POINT);
317 		if (bSuccess)
318 			_rValue <<= (sal_Int16)nWidth;
319 
320 		return bSuccess;
321 	}
322 
323 	//---------------------------------------------------------------------
exportXML(::rtl::OUString & _rStrExpValue,const Any & _rValue,const SvXMLUnitConverter &) const324 	sal_Bool OFontWidthHandler::exportXML( ::rtl::OUString& _rStrExpValue, const Any& _rValue, const SvXMLUnitConverter& ) const
325 	{
326 		sal_Int16 nWidth = 0;
327 		::rtl::OUStringBuffer aResult;
328 		if (_rValue >>= nWidth)
329 			SvXMLUnitConverter::convertMeasure(aResult, nWidth, MAP_POINT, MAP_POINT);
330 		_rStrExpValue = aResult.makeStringAndClear();
331 
332 		return _rStrExpValue.getLength() != 0;
333 	}
334 
335 	//=====================================================================
336 	//= ORotationAngleHandler
337 	//=====================================================================
338 	//---------------------------------------------------------------------
ORotationAngleHandler()339 	ORotationAngleHandler::ORotationAngleHandler()
340 	{
341 	}
342 
343 	//---------------------------------------------------------------------
importXML(const::rtl::OUString & _rStrImpValue,Any & _rValue,const SvXMLUnitConverter &) const344 	sal_Bool ORotationAngleHandler::importXML( const ::rtl::OUString& _rStrImpValue, Any& _rValue, const SvXMLUnitConverter& ) const
345 	{
346 		double fValue;
347 		sal_Bool bSucces =
348             SvXMLUnitConverter::convertDouble(fValue, _rStrImpValue);
349 		if (bSucces)
350 		{
351 			fValue *= 10;
352 			_rValue <<= (float)fValue;
353 		}
354 
355 		return bSucces;
356 	}
357 
358 	//---------------------------------------------------------------------
exportXML(::rtl::OUString & _rStrExpValue,const Any & _rValue,const SvXMLUnitConverter &) const359 	sal_Bool ORotationAngleHandler::exportXML( ::rtl::OUString& _rStrExpValue, const Any& _rValue, const SvXMLUnitConverter& ) const
360 	{
361 		float fAngle = 0;
362 		sal_Bool bSuccess = (_rValue >>= fAngle);
363 
364 		if (bSuccess)
365 		{
366 			rtl::OUStringBuffer sValue;
367 			SvXMLUnitConverter::convertDouble(sValue, ((double)fAngle) / 10);
368 			_rStrExpValue = sValue.makeStringAndClear();
369 		}
370 
371 		return bSuccess;
372 	}
373 
374 	//=====================================================================
375 	//= ImageScaleModeHandler
376 	//=====================================================================
377 	//---------------------------------------------------------------------
ImageScaleModeHandler()378     ImageScaleModeHandler::ImageScaleModeHandler()
379         :XMLConstantsPropertyHandler( OEnumMapper::getEnumMap( OEnumMapper::epImageScaleMode ), XML_STRETCH )
380     {
381     }
382 
383 //.........................................................................
384 }	// namespace xmloff
385 //.........................................................................
386 
387