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