xref: /AOO41X/main/xmloff/source/style/xmlbahdl.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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 <tools/debug.hxx>
27 #include <xmlbahdl.hxx>
28 #include <xmloff/xmluconv.hxx>
29 #include <com/sun/star/uno/Any.hxx>
30 #include <xmloff/xmltoken.hxx>
31 
32 using ::rtl::OUString;
33 using ::rtl::OUStringBuffer;
34 
35 using namespace ::com::sun::star::uno;
36 using namespace ::xmloff::token;
37 
lcl_xmloff_setAny(Any & rValue,sal_Int32 nValue,sal_Int8 nBytes)38 void lcl_xmloff_setAny( Any& rValue, sal_Int32 nValue, sal_Int8 nBytes )
39 {
40     switch( nBytes )
41     {
42     case 1:
43         if( nValue < SCHAR_MIN )
44             nValue = SCHAR_MIN;
45         else if( nValue > SCHAR_MAX )
46             nValue = SCHAR_MAX;
47         rValue <<= (sal_Int8)nValue;
48         break;
49     case 2:
50         if( nValue < SHRT_MIN )
51             nValue = SHRT_MIN;
52         else if( nValue > SHRT_MAX )
53             nValue = SHRT_MAX;
54         rValue <<= (sal_Int16)nValue;
55         break;
56     case 4:
57         rValue <<= nValue;
58         break;
59     }
60 }
61 
lcl_xmloff_getAny(const Any & rValue,sal_Int32 & nValue,sal_Int8 nBytes)62 sal_Bool lcl_xmloff_getAny( const Any& rValue, sal_Int32& nValue,
63                             sal_Int8 nBytes )
64 {
65     sal_Bool bRet = sal_False;
66 
67     switch( nBytes )
68     {
69     case 1:
70         {
71             sal_Int8 nValue8 = 0;
72             bRet = rValue >>= nValue8;
73             nValue = nValue8;
74         }
75         break;
76     case 2:
77         {
78             sal_Int16 nValue16 = 0;
79             bRet = rValue >>= nValue16;
80             nValue = nValue16;
81         }
82         break;
83     case 4:
84         bRet = rValue >>= nValue;
85         break;
86     }
87 
88     return bRet;
89 }
90 
91 ///////////////////////////////////////////////////////////////////////////////
92 //
93 // class XMLNumberPropHdl
94 //
95 
~XMLNumberPropHdl()96 XMLNumberPropHdl::~XMLNumberPropHdl()
97 {
98     // nothing to do
99 }
100 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const101 sal_Bool XMLNumberPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
102 {
103     sal_Bool bRet = sal_False;
104 
105     sal_Int32 nValue = 0;
106     bRet = SvXMLUnitConverter::convertNumber( nValue, rStrImpValue );
107     lcl_xmloff_setAny( rValue, nValue, nBytes );
108 
109     return bRet;
110 }
111 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const112 sal_Bool XMLNumberPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
113 {
114     sal_Bool bRet = sal_False;
115     sal_Int32 nValue;
116     OUStringBuffer aOut;
117 
118     if( lcl_xmloff_getAny( rValue, nValue, nBytes ) )
119     {
120         SvXMLUnitConverter::convertNumber( aOut, nValue );
121         rStrExpValue = aOut.makeStringAndClear();
122 
123         bRet = sal_True;
124     }
125 
126     return bRet;
127 }
128 
129 ///////////////////////////////////////////////////////////////////////////////
130 // class XMLNumberNonePropHdl
131 //
132 
XMLNumberNonePropHdl(sal_Int8 nB)133 XMLNumberNonePropHdl::XMLNumberNonePropHdl( sal_Int8 nB ) :
134     sZeroStr( GetXMLToken(XML_NO_LIMIT) ),
135     nBytes( nB )
136 {
137 }
138 
XMLNumberNonePropHdl(enum XMLTokenEnum eZeroString,sal_Int8 nB)139 XMLNumberNonePropHdl::XMLNumberNonePropHdl( enum XMLTokenEnum eZeroString, sal_Int8 nB ) :
140     sZeroStr( GetXMLToken( eZeroString ) ),
141     nBytes( nB )
142 {
143 }
144 
~XMLNumberNonePropHdl()145 XMLNumberNonePropHdl::~XMLNumberNonePropHdl()
146 {
147     // nothing to do
148 }
149 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const150 sal_Bool XMLNumberNonePropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
151 {
152     sal_Bool bRet = sal_False;
153 
154     sal_Int32 nValue = 0;
155     if( rStrImpValue == sZeroStr )
156     {
157         bRet = sal_True;
158     }
159     else
160     {
161         bRet = SvXMLUnitConverter::convertNumber( nValue, rStrImpValue );
162     }
163     lcl_xmloff_setAny( rValue, nValue, nBytes );
164 
165     return bRet;
166 }
167 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const168 sal_Bool XMLNumberNonePropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
169 {
170     sal_Bool bRet = sal_False;
171     sal_Int32 nValue;
172 
173     if( lcl_xmloff_getAny( rValue, nValue, nBytes ) )
174     {
175         OUStringBuffer aOut;
176 
177         if( nValue == 0 )
178         {
179             aOut.append( sZeroStr );
180         }
181         else
182         {
183             SvXMLUnitConverter::convertNumber( aOut, nValue );
184         }
185 
186         rStrExpValue = aOut.makeStringAndClear();
187 
188         bRet = sal_True;
189     }
190 
191     return bRet;
192 }
193 
194 ///////////////////////////////////////////////////////////////////////////////
195 //
196 // class XMLMeasurePropHdl
197 //
198 
~XMLMeasurePropHdl()199 XMLMeasurePropHdl::~XMLMeasurePropHdl()
200 {
201     // nothing to do
202 }
203 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter & rUnitConverter) const204 sal_Bool XMLMeasurePropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const
205 {
206     sal_Bool bRet = sal_False;
207 
208     sal_Int32 nValue = 0;
209     bRet = rUnitConverter.convertMeasure( nValue, rStrImpValue );
210     lcl_xmloff_setAny( rValue, nValue, nBytes );
211 
212     return bRet;
213 }
214 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter & rUnitConverter) const215 sal_Bool XMLMeasurePropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const
216 {
217     sal_Bool bRet = sal_False;
218     sal_Int32 nValue;
219     OUStringBuffer aOut;
220 
221     if( lcl_xmloff_getAny( rValue, nValue, nBytes ) )
222     {
223         rUnitConverter.convertMeasure( aOut, nValue );
224         rStrExpValue = aOut.makeStringAndClear();
225 
226         bRet = sal_True;
227     }
228 
229     return bRet;
230 }
231 
232 ///////////////////////////////////////////////////////////////////////////////
233 //
234 // class XMLBoolPropHdl
235 //
236 
~XMLBoolPropHdl()237 XMLBoolPropHdl::~XMLBoolPropHdl()
238 {
239     // nothing to do
240 }
241 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const242 sal_Bool XMLBoolPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
243 {
244     sal_Bool bRet = sal_False;
245 
246     sal_Bool bValue;
247     bRet = SvXMLUnitConverter::convertBool( bValue, rStrImpValue );
248     rValue <<= sal_Bool(bValue);
249 
250     return bRet;
251 }
252 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const253 sal_Bool XMLBoolPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
254 {
255     sal_Bool bRet = sal_False;
256     OUStringBuffer aOut;
257     sal_Bool bValue = sal_Bool();
258 
259     if (rValue >>= bValue)
260     {
261         SvXMLUnitConverter::convertBool( aOut, bValue );
262         rStrExpValue = aOut.makeStringAndClear();
263 
264         bRet = sal_True;
265     }
266 
267     return bRet;
268 }
269 
270 ///////////////////////////////////////////////////////////////////////////////
271 //
272 // class XMLNBoolPropHdl
273 //
274 
~XMLNBoolPropHdl()275 XMLNBoolPropHdl::~XMLNBoolPropHdl()
276 {
277     // nothing to do
278 }
279 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const280 sal_Bool XMLNBoolPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
281 {
282     sal_Bool bRet = sal_False;
283 
284     sal_Bool bValue;
285     bRet = SvXMLUnitConverter::convertBool( bValue, rStrImpValue );
286     rValue <<= sal_Bool(!bValue);
287 
288     return bRet;
289 }
290 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const291 sal_Bool XMLNBoolPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
292 {
293     sal_Bool bRet = sal_False;
294     OUStringBuffer aOut;
295     sal_Bool bValue = sal_Bool();
296 
297     if (rValue >>= bValue)
298     {
299         SvXMLUnitConverter::convertBool( aOut, !bValue );
300         rStrExpValue = aOut.makeStringAndClear();
301 
302         bRet = sal_True;
303     }
304 
305     return bRet;
306 }
307 
308 ///////////////////////////////////////////////////////////////////////////////
309 //
310 // class XMLPercentPropHdl
311 //
312 
~XMLPercentPropHdl()313 XMLPercentPropHdl::~XMLPercentPropHdl()
314 {
315     // nothing to do
316 }
317 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const318 sal_Bool XMLPercentPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
319 {
320     sal_Bool bRet = sal_False;
321 
322     sal_Int32 nValue = 0;
323     bRet = SvXMLUnitConverter::convertPercent( nValue, rStrImpValue );
324     lcl_xmloff_setAny( rValue, nValue, nBytes );
325 
326     return bRet;
327 }
328 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const329 sal_Bool XMLPercentPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
330 {
331     sal_Bool bRet = sal_False;
332     sal_Int32 nValue;
333     OUStringBuffer aOut;
334 
335     if( lcl_xmloff_getAny( rValue, nValue, nBytes ) )
336     {
337         SvXMLUnitConverter::convertPercent( aOut, nValue );
338         rStrExpValue = aOut.makeStringAndClear();
339 
340         bRet = sal_True;
341     }
342 
343     return bRet;
344 }
345 
346 ///////////////////////////////////////////////////////////////////////////////
347 //
348 // class XMLDoublePercentPropHdl
349 //
350 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const351 sal_Bool XMLDoublePercentPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
352 {
353     sal_Bool bRet = sal_False;
354 
355     double fValue = 1.0;
356 
357     if( rStrImpValue.indexOf( (sal_Unicode)'%' ) == -1 )
358     {
359         fValue = rStrImpValue.toDouble();
360     }
361     else
362     {
363         sal_Int32 nValue = 0;
364         bRet = SvXMLUnitConverter::convertPercent( nValue, rStrImpValue );
365         fValue = ((double)nValue) / 100.0;
366     }
367     rValue <<= fValue;
368 
369     return bRet;
370 }
371 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const372 sal_Bool XMLDoublePercentPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
373 {
374     sal_Bool bRet = sal_False;
375     double fValue = 0;
376 
377     if( rValue >>= fValue )
378     {
379         fValue *= 100.0;
380         if( fValue > 0 ) fValue += 0.5; else    fValue -= 0.5;
381 
382         sal_Int32 nValue = (sal_Int32)fValue;
383 
384         OUStringBuffer aOut;
385         SvXMLUnitConverter::convertPercent( aOut, nValue );
386         rStrExpValue = aOut.makeStringAndClear();
387 
388         bRet = sal_True;
389     }
390 
391     return bRet;
392 }
393 
394 
395 ///////////////////////////////////////////////////////////////////////////////
396 //
397 // class XMLNegPercentPropHdl
398 //
399 
~XMLNegPercentPropHdl()400 XMLNegPercentPropHdl::~XMLNegPercentPropHdl()
401 {
402     // nothing to do
403 }
404 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const405 sal_Bool XMLNegPercentPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
406 {
407     sal_Bool bRet = sal_False;
408 
409     sal_Int32 nValue = 0;
410     bRet = SvXMLUnitConverter::convertPercent( nValue, rStrImpValue );
411     lcl_xmloff_setAny( rValue, 100-nValue, nBytes );
412 
413     return bRet;
414 }
415 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const416 sal_Bool XMLNegPercentPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
417 {
418     sal_Bool bRet = sal_False;
419     sal_Int32 nValue;
420     OUStringBuffer aOut;
421 
422     if( lcl_xmloff_getAny( rValue, nValue, nBytes ) )
423     {
424         SvXMLUnitConverter::convertPercent( aOut, 100-nValue );
425         rStrExpValue = aOut.makeStringAndClear();
426 
427         bRet = sal_True;
428     }
429 
430     return bRet;
431 }
432 
433 
434 ///////////////////////////////////////////////////////////////////////////////
435 //
436 // class XMLMeasurePxPropHdl
437 //
438 
~XMLMeasurePxPropHdl()439 XMLMeasurePxPropHdl::~XMLMeasurePxPropHdl()
440 {
441     // nothing to do
442 }
443 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const444 sal_Bool XMLMeasurePxPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
445 {
446     sal_Bool bRet = sal_False;
447 
448     sal_Int32 nValue = 0;
449     bRet = SvXMLUnitConverter::convertMeasurePx( nValue, rStrImpValue );
450     lcl_xmloff_setAny( rValue, nValue, nBytes );
451 
452     return bRet;
453 }
454 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const455 sal_Bool XMLMeasurePxPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
456 {
457     sal_Bool bRet = sal_False;
458     sal_Int32 nValue;
459     OUStringBuffer aOut;
460 
461     if( lcl_xmloff_getAny( rValue, nValue, nBytes ) )
462     {
463         SvXMLUnitConverter::convertMeasurePx( aOut, nValue );
464         rStrExpValue = aOut.makeStringAndClear();
465 
466         bRet = sal_True;
467     }
468 
469     return bRet;
470 }
471 
472 ///////////////////////////////////////////////////////////////////////////////
473 //
474 // class XMLColorPropHdl
475 //
476 
~XMLColorPropHdl()477 XMLColorPropHdl::~XMLColorPropHdl()
478 {
479     // Nothing to do
480 }
481 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const482 sal_Bool XMLColorPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
483 {
484     sal_Bool bRet = sal_False;
485     Color aColor;
486 
487     const OUString astrHSL( RTL_CONSTASCII_USTRINGPARAM( "hsl" ) );
488     if( rStrImpValue.matchIgnoreAsciiCase( astrHSL ) )
489     {
490         sal_Int32 nOpen = rStrImpValue.indexOf( '(' );
491         sal_Int32 nClose = rStrImpValue.lastIndexOf( ')' );
492 
493         if( (nOpen != -1) && (nClose > nOpen) )
494         {
495             const OUString aTmp( rStrImpValue.copy( nOpen+1, nClose - nOpen-1) );
496 
497             sal_Int32 nIndex = 0;
498 
499             Sequence< double > aHSL(3);
500             aHSL[0] = aTmp.getToken( 0, ',', nIndex ).toDouble();
501             aHSL[1] = aTmp.getToken( 0, ',', nIndex ).toDouble() / 100.0;
502             aHSL[2] = aTmp.getToken( 0, ',', nIndex ).toDouble() / 100.0;
503             rValue <<= aHSL;
504             bRet = true;
505         }
506     }
507     else
508     {
509         bRet = SvXMLUnitConverter::convertColor( aColor, rStrImpValue );
510         rValue <<= (sal_Int32)( aColor.GetColor() );
511     }
512 
513     return bRet;
514 }
515 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const516 sal_Bool XMLColorPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
517 {
518     sal_Bool bRet = sal_False;
519     Color aColor;
520     sal_Int32 nColor = 0;
521 
522     OUStringBuffer aOut;
523     if( rValue >>= nColor )
524     {
525         aColor.SetColor( nColor );
526 
527         SvXMLUnitConverter::convertColor( aOut, aColor );
528         rStrExpValue = aOut.makeStringAndClear();
529 
530         bRet = sal_True;
531     }
532     else
533     {
534         Sequence< double > aHSL;
535         if( (rValue >>= aHSL) && (aHSL.getLength() == 3) )
536         {
537             aOut.append( OUString::createFromAscii("hsl(") );
538             aOut.append( aHSL[0] );
539             aOut.append( OUString::createFromAscii(",") );
540             aOut.append( aHSL[1] * 100.0 );
541             aOut.append( OUString::createFromAscii("%,") );
542             aOut.append( aHSL[2] * 100.0 );
543             aOut.append( OUString::createFromAscii("%)") );
544             rStrExpValue = aOut.makeStringAndClear();
545 
546             bRet = sal_True;
547         }
548     }
549 
550     return bRet;
551 }
552 
553 ///////////////////////////////////////////////////////////////////////////////
554 //
555 // class XMLStringPropHdl
556 //
557 
~XMLStringPropHdl()558 XMLStringPropHdl::~XMLStringPropHdl()
559 {
560     // Nothing to do
561 }
562 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const563 sal_Bool XMLStringPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
564 {
565     sal_Bool bRet = sal_False;
566 
567     rValue <<= rStrImpValue;
568     bRet = sal_True;
569 
570     return bRet;
571 }
572 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const573 sal_Bool XMLStringPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
574 {
575     sal_Bool bRet = sal_False;
576 
577     if( rValue >>= rStrExpValue )
578         bRet = sal_True;
579 
580     return bRet;
581 }
582 
583 ///////////////////////////////////////////////////////////////////////////////
584 //
585 // class XMLStyleNamePropHdl
586 //
587 
~XMLStyleNamePropHdl()588 XMLStyleNamePropHdl::~XMLStyleNamePropHdl()
589 {
590     // Nothing to do
591 }
592 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter & rUnitConverter) const593 sal_Bool XMLStyleNamePropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const
594 {
595     sal_Bool bRet = sal_False;
596 
597     if( rValue >>= rStrExpValue )
598     {
599         rStrExpValue = rUnitConverter.encodeStyleName( rStrExpValue );
600         bRet = sal_True;
601     }
602 
603     return bRet;
604 }
605 
606 
607 ///////////////////////////////////////////////////////////////////////////////
608 //
609 // class XMLDoublePropHdl
610 //
611 
~XMLDoublePropHdl()612 XMLDoublePropHdl::~XMLDoublePropHdl()
613 {
614     // Nothing to do
615 }
616 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const617 sal_Bool XMLDoublePropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
618 {
619     double fDblValue;
620     sal_Bool bRet = SvXMLUnitConverter::convertDouble( fDblValue, rStrImpValue );
621     rValue <<= fDblValue;
622     return bRet;
623 }
624 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const625 sal_Bool XMLDoublePropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
626 {
627     sal_Bool bRet = sal_False;
628 
629     double fValue = 0;
630 
631     if( rValue >>= fValue )
632     {
633         OUStringBuffer aOut;
634         SvXMLUnitConverter::convertDouble( aOut, fValue );
635         rStrExpValue = aOut.makeStringAndClear();
636         bRet = sal_True;
637     }
638 
639     return bRet;
640 }
641 
642 ///////////////////////////////////////////////////////////////////////////////
643 //
644 // class XMLColorTransparentPropHdl
645 //
646 
XMLColorTransparentPropHdl(enum XMLTokenEnum eTransparent)647 XMLColorTransparentPropHdl::XMLColorTransparentPropHdl(
648     enum XMLTokenEnum eTransparent ) :
649     sTransparent( GetXMLToken(
650         eTransparent != XML_TOKEN_INVALID ? eTransparent : XML_TRANSPARENT ) )
651 {
652     // Nothing to do
653 }
654 
~XMLColorTransparentPropHdl()655 XMLColorTransparentPropHdl::~XMLColorTransparentPropHdl()
656 {
657     // Nothing to do
658 }
659 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const660 sal_Bool XMLColorTransparentPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
661 {
662     sal_Bool bRet = sal_False;
663 
664     if( rStrImpValue != sTransparent )
665     {
666         Color aColor;
667         bRet = SvXMLUnitConverter::convertColor( aColor, rStrImpValue );
668         rValue <<= (sal_Int32)( aColor.GetColor() );
669     }
670 
671     return bRet;
672 }
673 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const674 sal_Bool XMLColorTransparentPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
675 {
676     sal_Bool bRet = sal_False;
677     sal_Int32 nColor = 0;
678 
679     if( rStrExpValue == sTransparent )
680         bRet = sal_False;
681     else if( rValue >>= nColor )
682     {
683         Color aColor( nColor );
684         OUStringBuffer aOut;
685         SvXMLUnitConverter::convertColor( aOut, aColor );
686         rStrExpValue = aOut.makeStringAndClear();
687 
688         bRet = sal_True;
689     }
690 
691     return bRet;
692 }
693 
694 
695 ///////////////////////////////////////////////////////////////////////////////
696 //
697 // class XMLIsTransparentPropHdl
698 //
699 
XMLIsTransparentPropHdl(enum XMLTokenEnum eTransparent,sal_Bool bTransPropVal)700 XMLIsTransparentPropHdl::XMLIsTransparentPropHdl(
701     enum XMLTokenEnum eTransparent, sal_Bool bTransPropVal ) :
702     sTransparent( GetXMLToken(
703         eTransparent != XML_TOKEN_INVALID ? eTransparent : XML_TRANSPARENT ) ),
704     bTransPropValue( bTransPropVal )
705 {
706 }
707 
~XMLIsTransparentPropHdl()708 XMLIsTransparentPropHdl::~XMLIsTransparentPropHdl()
709 {
710     // Nothing to do
711 }
712 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const713 sal_Bool XMLIsTransparentPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
714 {
715     sal_Bool bValue = ( (rStrImpValue == sTransparent) == bTransPropValue);
716     rValue.setValue( &bValue, ::getBooleanCppuType() );
717 
718     return sal_True;
719 }
720 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const721 sal_Bool XMLIsTransparentPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
722 {
723     sal_Bool bRet = sal_False;
724 
725     // MIB: This looks a bit strange, because bTransPropValue == bValue should
726     // do the same, but this only applies if 'true' is represented by the same
727     // 8 bit value in bValue and bTransPropValue. Who will ensure this?
728     sal_Bool bValue = *(sal_Bool *)rValue.getValue();
729     sal_Bool bIsTrans = bTransPropValue ? bValue : !bValue;
730 
731     if( bIsTrans )
732     {
733         rStrExpValue = sTransparent;
734         bRet = sal_True;
735     }
736 
737     return bRet;
738 }
739 
740 ///////////////////////////////////////////////////////////////////////////////
741 //
742 // class XMLColorAutoPropHdl
743 //
744 
XMLColorAutoPropHdl()745 XMLColorAutoPropHdl::XMLColorAutoPropHdl()
746 {
747     // Nothing to do
748 }
749 
~XMLColorAutoPropHdl()750 XMLColorAutoPropHdl::~XMLColorAutoPropHdl()
751 {
752     // Nothing to do
753 }
754 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const755 sal_Bool XMLColorAutoPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
756 {
757     sal_Bool bRet = sal_False;
758 
759     // This is a multi property: the value might be set to AUTO_COLOR
760     // already by the XMLIsAutoColorPropHdl!
761     sal_Int32 nColor = 0;
762     if( !(rValue >>= nColor) || -1 != nColor )
763     {
764         Color aColor;
765         bRet = SvXMLUnitConverter::convertColor( aColor, rStrImpValue );
766         if( bRet )
767             rValue <<= (sal_Int32)( aColor.GetColor() );
768     }
769 
770     return bRet;
771 }
772 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const773 sal_Bool XMLColorAutoPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
774 {
775     sal_Bool bRet = sal_False;
776 
777     sal_Int32 nColor = 0;
778     if( (rValue >>= nColor) && -1 != nColor )
779     {
780         Color aColor( nColor );
781         OUStringBuffer aOut;
782         SvXMLUnitConverter::convertColor( aOut, aColor );
783         rStrExpValue = aOut.makeStringAndClear();
784 
785         bRet = sal_True;
786     }
787 
788     return bRet;
789 }
790 
791 ///////////////////////////////////////////////////////////////////////////////
792 //
793 // class XMLIsAutoColorPropHdl
794 //
795 
XMLIsAutoColorPropHdl()796 XMLIsAutoColorPropHdl::XMLIsAutoColorPropHdl()
797 {
798 }
799 
~XMLIsAutoColorPropHdl()800 XMLIsAutoColorPropHdl::~XMLIsAutoColorPropHdl()
801 {
802     // Nothing to do
803 }
804 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const805 sal_Bool XMLIsAutoColorPropHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
806 {
807     sal_Bool bValue;
808 
809     // An auto color overrides any other color set!
810     sal_Bool bRet = SvXMLUnitConverter::convertBool( bValue, rStrImpValue );
811     if( bRet && bValue )
812         rValue <<= (sal_Int32)-1;
813 
814     return sal_True;
815 }
816 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const817 sal_Bool XMLIsAutoColorPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
818 {
819     sal_Bool bRet = sal_False;
820     sal_Int32 nColor = 0;
821 
822     if( (rValue >>= nColor) && -1 == nColor )
823     {
824         OUStringBuffer aOut;
825         SvXMLUnitConverter::convertBool( aOut, sal_True );
826         rStrExpValue = aOut.makeStringAndClear();
827 
828         bRet = sal_True;
829     }
830 
831     return bRet;
832 }
833 
834 ///////////////////////////////////////////////////////////////////////////////
835 //
836 // class XMLCompareOnlyPropHdl
837 //
838 
~XMLCompareOnlyPropHdl()839 XMLCompareOnlyPropHdl::~XMLCompareOnlyPropHdl()
840 {
841     // Nothing to do
842 }
843 
importXML(const OUString &,Any &,const SvXMLUnitConverter &) const844 sal_Bool XMLCompareOnlyPropHdl::importXML( const OUString&, Any&, const SvXMLUnitConverter& ) const
845 {
846     DBG_ASSERT( !this, "importXML called for compare-only-property" );
847     return sal_False;
848 }
849 
exportXML(OUString &,const Any &,const SvXMLUnitConverter &) const850 sal_Bool XMLCompareOnlyPropHdl::exportXML( OUString&, const Any&, const SvXMLUnitConverter& ) const
851 {
852     DBG_ASSERT( !this, "exportXML called for compare-only-property" );
853     return sal_False;
854 }
855 
856 ///////////////////////////////////////////////////////////////////////////////
857 // class XMLNumberWithoutZeroPropHdl
858 //
859 
XMLNumberWithoutZeroPropHdl(sal_Int8 nB)860 XMLNumberWithoutZeroPropHdl::XMLNumberWithoutZeroPropHdl( sal_Int8 nB ) :
861     nBytes( nB )
862 {
863 }
864 
~XMLNumberWithoutZeroPropHdl()865 XMLNumberWithoutZeroPropHdl::~XMLNumberWithoutZeroPropHdl()
866 {
867 }
868 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const869 sal_Bool XMLNumberWithoutZeroPropHdl::importXML(
870     const OUString& rStrImpValue,
871     Any& rValue,
872     const SvXMLUnitConverter& ) const
873 {
874     sal_Int32 nValue = 0;
875     sal_Bool bRet = SvXMLUnitConverter::convertNumber( nValue, rStrImpValue );
876     if( bRet )
877         lcl_xmloff_setAny( rValue, nValue, nBytes );
878     return bRet;
879 }
880 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const881 sal_Bool XMLNumberWithoutZeroPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
882 {
883 
884     sal_Int32 nValue = 0;
885     sal_Bool bRet = lcl_xmloff_getAny( rValue, nValue, nBytes );
886     bRet &= nValue != 0;
887 
888     if( bRet )
889     {
890         OUStringBuffer aBuffer;
891         SvXMLUnitConverter::convertNumber( aBuffer, nValue );
892         rStrExpValue = aBuffer.makeStringAndClear();
893     }
894 
895     return bRet;
896 }
897 
898 ///////////////////////////////////////////////////////////////////////////////
899 // class XMLNumberWithAutoInsteadZeroPropHdl
900 //
901 
~XMLNumberWithAutoInsteadZeroPropHdl()902 XMLNumberWithAutoInsteadZeroPropHdl::~XMLNumberWithAutoInsteadZeroPropHdl()
903 {
904 }
905 
importXML(const OUString & rStrImpValue,Any & rValue,const SvXMLUnitConverter &) const906 sal_Bool XMLNumberWithAutoInsteadZeroPropHdl::importXML(
907     const OUString& rStrImpValue,
908     Any& rValue,
909     const SvXMLUnitConverter& ) const
910 {
911     sal_Int32 nValue = 0;
912     sal_Bool bRet = SvXMLUnitConverter::convertNumber( nValue, rStrImpValue );
913     if( bRet )
914         lcl_xmloff_setAny( rValue, nValue, 2 );
915     else if( rStrImpValue == GetXMLToken( XML_AUTO ) )
916     {
917         rValue <<= (sal_Int16)nValue;
918         bRet = sal_True;
919     }
920     return bRet;
921 }
922 
exportXML(OUString & rStrExpValue,const Any & rValue,const SvXMLUnitConverter &) const923 sal_Bool XMLNumberWithAutoInsteadZeroPropHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
924 {
925 
926     sal_Int32 nValue = 0;
927     lcl_xmloff_getAny( rValue, nValue, 2 );
928 
929     if( 0 == nValue )
930         rStrExpValue = GetXMLToken( XML_AUTO );
931     else
932     {
933         OUStringBuffer aBuffer;
934         SvXMLUnitConverter::convertNumber( aBuffer, nValue );
935         rStrExpValue = aBuffer.makeStringAndClear();
936     }
937 
938     return sal_True;
939 }
940 
941