xref: /AOO41X/main/xmloff/source/style/xmlnumi.cxx (revision bbc04ba5ed3e20f44d0cd1ddaa368cbfb995c446)
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 
27 #include <com/sun/star/beans/PropertyValue.hpp>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/awt/Size.hpp>
30 #include <com/sun/star/awt/FontDescriptor.hpp>
31 #include <com/sun/star/document/XLinkAuthorizer.hpp>
32 #include <com/sun/star/text/HoriOrientation.hpp>
33 #include <com/sun/star/text/VertOrientation.hpp>
34 // --> OD 2008-01-16 #newlistlevelattrs#
35 #include <com/sun/star/text/PositionAndSpaceMode.hpp>
36 #include <com/sun/star/text/LabelFollow.hpp>
37 // <--
38 #include <com/sun/star/container/XNameContainer.hpp>
39 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
40 #include <com/sun/star/style/XStyle.hpp>
41 #include <com/sun/star/io/XOutputStream.hpp>
42 
43 #include <rtl/ustrbuf.hxx>
44 
45 #include <tools/urlobj.hxx>
46 #include <tools/debug.hxx>
47 #include <tools/fontenum.hxx>
48 
49 #include <xmloff/xmltkmap.hxx>
50 #include <xmloff/nmspmap.hxx>
51 #include "xmloff/xmlnmspe.hxx"
52 #include <xmloff/xmlimp.hxx>
53 #include <xmloff/XMLBase64ImportContext.hxx>
54 #include <xmloff/xmltoken.hxx>
55 
56 #include <xmloff/i18nmap.hxx>
57 #include <xmloff/xmluconv.hxx>
58 #include "fonthdl.hxx"
59 #include <xmloff/XMLFontStylesContext.hxx>
60 #include <xmloff/families.hxx>
61 #include <xmloff/maptype.hxx>
62 
63 #include <xmloff/xmlnumi.hxx>
64 
65 #define _SVSTDARR_USHORTS
66 #include <svl/svstdarr.hxx>
67 
68 
69 using ::rtl::OUString;
70 using ::rtl::OUStringBuffer;
71 
72 using namespace ::com::sun::star;
73 using namespace ::com::sun::star::uno;
74 using namespace ::com::sun::star::style;
75 using namespace ::com::sun::star::text;
76 using namespace ::com::sun::star::beans;
77 using namespace ::com::sun::star::container;
78 using namespace ::com::sun::star::lang;
79 using namespace ::com::sun::star::frame;
80 using namespace ::xmloff::token;
81 using namespace ::com::sun::star::io;
82 
83 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_SYMBOL_TEXT_DISTANCE[] =
84         "SymbolTextDistance";
85 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_PARENT_NUMBERING[] =
86         "ParentNumbering";
87 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_CHAR_STYLE_NAME[] =
88         "CharStyleName";
89 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_CHAR[] ="BulletChar";
90 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_RELSIZE[] = "BulletRelSize";
91 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_GRAPHIC_SIZE[] =
92         "GraphicSize";
93 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_VERT_ORIENT[] ="VertOrient";
94 
95 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_NUMBERINGTYPE[] = "NumberingType";
96 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_PREFIX[] = "Prefix";
97 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_SUFFIX[] = "Suffix";
98 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_ADJUST[] = "Adjust";
99 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LEFT_MARGIN[] = "LeftMargin";
100 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_FIRST_LINE_OFFSET[] =
101     "FirstLineOffset";
102 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_FONT[] = "BulletFont";
103 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_GRAPHICURL[] = "GraphicURL";
104 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_START_WITH[] = "StartWith";
105 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_COLOR[] = "BulletColor";
106 // --> OD 2008-01-15 #newlistlevelattrs#
107 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_POSITION_AND_SPACE_MODE[] = "PositionAndSpaceMode";
108 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LABEL_FOLLOWED_BY[] = "LabelFollowedBy";
109 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LISTTAB_STOP_POSITION[] = "ListtabStopPosition";
110 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_FIRST_LINE_INDENT[] = "FirstLineIndent";
111 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_INDENT_AT[] = "IndentAt";
112 // <--
113 
114 // ---------------------------------------------------------------------
115 
116 class SvxXMLListLevelStyleContext_Impl;
117 
118 class SvxXMLListLevelStyleAttrContext_Impl : public SvXMLImportContext
119 {
120     SvxXMLListLevelStyleContext_Impl&   rListLevel;
121 
122 public:
123 
124     SvxXMLListLevelStyleAttrContext_Impl(
125             SvXMLImport& rImport, sal_uInt16 nPrfx,
126             const OUString& rLName,
127             const Reference< xml::sax::XAttributeList >& xAttrList,
128             SvxXMLListLevelStyleContext_Impl& rLLevel   );
129     virtual ~SvxXMLListLevelStyleAttrContext_Impl();
130 
131     // --> OD 2008-01-16 #newlistlevelattrs#
132     virtual SvXMLImportContext *CreateChildContext(
133             sal_uInt16 nPrefix, const OUString& rLocalName,
134             const Reference< xml::sax::XAttributeList > & xAttrList );
135     // <--
136 };
137 
138 // ---------------------------------------------------------------------
139 
140 // --> OD 2008-01-16 #newlistlevelattrs#
141 class SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl : public SvXMLImportContext
142 {
143     SvxXMLListLevelStyleContext_Impl&   rListLevel;
144 
145 public:
146 
147     SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(
148             SvXMLImport& rImport, sal_uInt16 nPrfx,
149             const OUString& rLName,
150             const Reference< xml::sax::XAttributeList >& xAttrList,
151             SvxXMLListLevelStyleContext_Impl& rLLevel   );
152     virtual ~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl();
153 };
154 // <--
155 
156 // ---------------------------------------------------------------------
157 
158 enum SvxXMLTextListLevelStyleAttrTokens
159 {
160     XML_TOK_TEXT_LEVEL_ATTR_LEVEL,
161     XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME,
162     XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR,
163     XML_TOK_TEXT_LEVEL_ATTR_HREF,
164     XML_TOK_TEXT_LEVEL_ATTR_TYPE,
165     XML_TOK_TEXT_LEVEL_ATTR_SHOW,
166     XML_TOK_TEXT_LEVEL_ATTR_ACTUATE,
167     XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT,
168     XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX,
169     XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX,
170     XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC,
171     XML_TOK_TEXT_LEVEL_ATTR_START_VALUE,
172     XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS,
173 
174     XML_TOK_TEXT_LEVEL_ATTR_END=XML_TOK_UNKNOWN
175 };
176 
lcl_getLevelAttrTokenMap()177 const SvXMLTokenMapEntry* lcl_getLevelAttrTokenMap()
178 {
179     static __FAR_DATA SvXMLTokenMapEntry aLevelAttrTokenMap[] =
180     {
181         { XML_NAMESPACE_TEXT, XML_LEVEL, XML_TOK_TEXT_LEVEL_ATTR_LEVEL },
182         { XML_NAMESPACE_TEXT, XML_STYLE_NAME, XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME },
183         { XML_NAMESPACE_TEXT, XML_BULLET_CHAR, XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR },
184         { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_TEXT_LEVEL_ATTR_HREF },
185         { XML_NAMESPACE_XLINK, XML_TYPE, XML_TOK_TEXT_LEVEL_ATTR_TYPE },
186         { XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_TEXT_LEVEL_ATTR_SHOW },
187         { XML_NAMESPACE_XLINK, XML_ACTUATE, XML_TOK_TEXT_LEVEL_ATTR_ACTUATE },
188 
189         { XML_NAMESPACE_STYLE, XML_NUM_FORMAT, XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT },
190         { XML_NAMESPACE_STYLE, XML_NUM_PREFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX },
191         { XML_NAMESPACE_STYLE, XML_NUM_SUFFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX },
192         { XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC, XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC },
193         { XML_NAMESPACE_TEXT, XML_START_VALUE, XML_TOK_TEXT_LEVEL_ATTR_START_VALUE },
194         { XML_NAMESPACE_TEXT, XML_DISPLAY_LEVELS, XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS },
195 
196         XML_TOKEN_MAP_END
197     };
198     return aLevelAttrTokenMap;
199 }
200 
201 class SvxXMLListLevelStyleContext_Impl : public SvXMLImportContext
202 {
203     friend class SvxXMLListLevelStyleAttrContext_Impl;
204     const OUString      sStarBats;
205     const OUString      sStarMath;
206 
207     OUString            sPrefix;
208     OUString            sSuffix;
209     OUString            sTextStyleName;
210     OUString            sNumFormat;
211     OUString            sNumLetterSync;
212     OUString            sBulletFontName;
213     OUString            sBulletFontStyleName;
214     OUString            sImageURL;
215 
216     Reference < XOutputStream > xBase64Stream;
217 
218     sal_Int32           nLevel;
219     sal_Int32           nSpaceBefore;
220     sal_Int32           nMinLabelWidth;
221     sal_Int32           nMinLabelDist;
222     sal_Int32           nImageWidth;
223     sal_Int32           nImageHeight;
224     sal_Int16           nNumStartValue;
225     sal_Int16           nNumDisplayLevels;
226 
227     sal_Int16           eAdjust;
228     sal_Int16           eBulletFontFamily;
229     sal_Int16           eBulletFontPitch;
230     rtl_TextEncoding    eBulletFontEncoding;
231     sal_Int16           eImageVertOrient;
232 
233     sal_Unicode         cBullet;
234 
235     sal_Int16           nRelSize;
236     Color               aColor;
237 
238     // --> OD 2008-01-16 #newlistlevelattrs#
239     sal_Int16           ePosAndSpaceMode;
240     sal_Int16           eLabelFollowedBy;
241     sal_Int32           nListtabStopPosition;
242     sal_Int32           nFirstLineIndent;
243     sal_Int32           nIndentAt;
244     // <--
245 
246     sal_Bool            bBullet : 1;
247     sal_Bool            bImage : 1;
248     sal_Bool            bNum : 1;
249     sal_Bool            bHasColor : 1;
250 
SetRelSize(sal_Int16 nRel)251     void SetRelSize( sal_Int16 nRel ) { nRelSize = nRel; }
SetColor(sal_Int32 _aColor)252     void SetColor( sal_Int32 _aColor ) { aColor = _aColor; bHasColor = sal_True; }
SetSpaceBefore(sal_Int32 nSet)253     void SetSpaceBefore( sal_Int32 nSet ) { nSpaceBefore = nSet; }
SetMinLabelWidth(sal_Int32 nSet)254     void SetMinLabelWidth( sal_Int32 nSet ) { nMinLabelWidth = nSet; }
SetMinLabelDist(sal_Int32 nSet)255     void SetMinLabelDist( sal_Int32 nSet ) { nMinLabelDist = nSet; }
SetAdjust(sal_Int16 eSet)256     void SetAdjust( sal_Int16 eSet ) { eAdjust = eSet; }
257 
SetBulletFontName(const OUString & rSet)258     void SetBulletFontName( const OUString& rSet ) { sBulletFontName = rSet; }
SetBulletFontStyleName(const OUString & rSet)259     void SetBulletFontStyleName( const OUString& rSet )
260          { sBulletFontStyleName = rSet; }
SetBulletFontFamily(sal_Int16 eSet)261     void SetBulletFontFamily( sal_Int16 eSet ) { eBulletFontFamily = eSet; }
SetBulletFontPitch(sal_Int16 eSet)262     void SetBulletFontPitch( sal_Int16 eSet ) { eBulletFontPitch = eSet; }
SetBulletFontEncoding(rtl_TextEncoding eSet)263     void SetBulletFontEncoding( rtl_TextEncoding eSet )
264          { eBulletFontEncoding = eSet; }
265 
SetImageWidth(sal_Int32 nSet)266     void SetImageWidth( sal_Int32 nSet ) { nImageWidth = nSet; }
SetImageHeight(sal_Int32 nSet)267     void SetImageHeight( sal_Int32 nSet ) { nImageHeight = nSet; }
SetImageVertOrient(sal_Int16 eSet)268     void SetImageVertOrient( sal_Int16 eSet )
269          { eImageVertOrient = eSet; }
270 
271 public:
272 
273     SvxXMLListLevelStyleContext_Impl(
274             SvXMLImport& rImport, sal_uInt16 nPrfx,
275             const OUString& rLName,
276             const Reference< xml::sax::XAttributeList > & xAttrList );
277     virtual ~SvxXMLListLevelStyleContext_Impl();
278 
279     virtual SvXMLImportContext *CreateChildContext(
280             sal_uInt16 nPrefix, const OUString& rLocalName,
281             const Reference< xml::sax::XAttributeList > & xAttrList );
282 
GetLevel() const283     sal_Int32 GetLevel() const { return nLevel; }
284     Sequence<beans::PropertyValue> GetProperties(
285             const SvI18NMap *pI18NMap=0 );
286 
287     // --> OD 2008-01-16 #newlistlevelattrs#
SetPosAndSpaceMode(sal_Int16 eValue)288     inline void SetPosAndSpaceMode( sal_Int16 eValue )
289     {
290         ePosAndSpaceMode = eValue;
291     }
SetLabelFollowedBy(sal_Int16 eValue)292     inline void SetLabelFollowedBy( sal_Int16 eValue )
293     {
294         eLabelFollowedBy = eValue;
295     }
SetListtabStopPosition(sal_Int32 nValue)296     inline void SetListtabStopPosition( sal_Int32 nValue )
297     {
298         nListtabStopPosition = nValue;
299     }
SetFirstLineIndent(sal_Int32 nValue)300     inline void SetFirstLineIndent( sal_Int32 nValue )
301     {
302         nFirstLineIndent = nValue;
303     }
SetIndentAt(sal_Int32 nValue)304     inline void SetIndentAt( sal_Int32 nValue )
305     {
306         nIndentAt = nValue;
307     }
308     // <--
309 };
310 
SvxXMLListLevelStyleContext_Impl(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<xml::sax::XAttributeList> & xAttrList)311 SvxXMLListLevelStyleContext_Impl::SvxXMLListLevelStyleContext_Impl(
312         SvXMLImport& rImport, sal_uInt16 nPrfx,
313         const OUString& rLName,
314         const Reference< xml::sax::XAttributeList > & xAttrList )
315 
316 :   SvXMLImportContext( rImport, nPrfx, rLName )
317 ,   sStarBats( RTL_CONSTASCII_USTRINGPARAM( "StarBats" ) )
318 ,   sStarMath( RTL_CONSTASCII_USTRINGPARAM( "StarMath" ) )
319 ,   sNumFormat( OUString::createFromAscii( "1" ) )
320 ,   nLevel( -1L )
321 ,   nSpaceBefore( 0L )
322 ,   nMinLabelWidth( 0L )
323 ,   nMinLabelDist( 0L )
324 ,   nImageWidth( 0L )
325 ,   nImageHeight( 0L )
326 ,   nNumStartValue( 1 )
327 ,   nNumDisplayLevels( 1 )
328 ,   eAdjust( HoriOrientation::LEFT )
329 ,   eBulletFontFamily( FAMILY_DONTKNOW )
330 ,   eBulletFontPitch( PITCH_DONTKNOW )
331 ,   eBulletFontEncoding( RTL_TEXTENCODING_DONTKNOW )
332 ,   eImageVertOrient(0)
333 ,   cBullet( 0 )
334 ,   nRelSize(0)
335 ,   aColor( 0 )
336 // --> OD 2008-01-16 #newlistelevelattrs#
337 ,   ePosAndSpaceMode( PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION )
338 ,   eLabelFollowedBy( LabelFollow::LISTTAB )
339 ,   nListtabStopPosition( 0 )
340 ,   nFirstLineIndent( 0 )
341 ,   nIndentAt( 0 )
342 // <--
343 ,   bBullet( sal_False )
344 ,   bImage( sal_False )
345 ,   bNum( sal_False )
346 ,   bHasColor( sal_False )
347 {
348     if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
349         IsXMLToken( rLName, XML_OUTLINE_LEVEL_STYLE )        )
350         bNum = sal_True;
351     else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_BULLET ) )
352         bBullet = sal_True;
353     else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_IMAGE ) )
354         bImage = sal_True;
355 
356     SvXMLTokenMap aTokenMap( lcl_getLevelAttrTokenMap() );
357     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
358     for( sal_Int16 i=0; i < nAttrCount; i++ )
359     {
360         const OUString& rAttrName = xAttrList->getNameByIndex( i );
361         OUString aLocalName;
362         sal_uInt16 nPrefix =
363             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
364                                                             &aLocalName );
365         const OUString& rValue = xAttrList->getValueByIndex( i );
366 
367         switch( aTokenMap.Get( nPrefix, aLocalName ) )
368         {
369         case XML_TOK_TEXT_LEVEL_ATTR_LEVEL:
370             nLevel = rValue.toInt32();
371             if( nLevel >= 1L )
372                 nLevel--;
373             else
374                 nLevel = 0;
375             break;
376         case XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME:
377             sTextStyleName = rValue;
378             break;
379         case XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR:
380             cBullet = rValue[0];
381             break;
382         case XML_TOK_TEXT_LEVEL_ATTR_HREF:
383             if( bImage )
384                 sImageURL = rValue;
385             break;
386         case XML_TOK_TEXT_LEVEL_ATTR_TYPE:
387         case XML_TOK_TEXT_LEVEL_ATTR_SHOW:
388         case XML_TOK_TEXT_LEVEL_ATTR_ACTUATE:
389             // This properties will be ignored
390             break;
391         case XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT:
392             if( bNum )
393                 sNumFormat = rValue;
394             break;
395         case XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX:
396             sPrefix = rValue;
397             break;
398         case XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX:
399             sSuffix = rValue;
400             break;
401         case XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC:
402             if( bNum )
403                 sNumLetterSync = rValue;
404             break;
405         case XML_TOK_TEXT_LEVEL_ATTR_START_VALUE:
406             if( bNum )
407             {
408                 sal_Int32 nTmp = rValue.toInt32();
409                 nNumStartValue =
410                     (nTmp < 0L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
411                                                         : (sal_Int16)nTmp );
412             }
413             break;
414         case XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS:
415             if( bNum )
416             {
417                 sal_Int32 nTmp = rValue.toInt32();
418                 nNumDisplayLevels =
419                     (nTmp < 1L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
420                                                         : (sal_Int16)nTmp );
421             }
422             break;
423         }
424     }
425 }
426 
~SvxXMLListLevelStyleContext_Impl()427 SvxXMLListLevelStyleContext_Impl::~SvxXMLListLevelStyleContext_Impl()
428 {
429 }
430 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList)431 SvXMLImportContext *SvxXMLListLevelStyleContext_Impl::CreateChildContext(
432         sal_uInt16 nPrefix, const OUString& rLocalName,
433         const Reference< xml::sax::XAttributeList > & xAttrList )
434 {
435     SvXMLImportContext *pContext = 0;
436     if( XML_NAMESPACE_STYLE == nPrefix &&
437         ( IsXMLToken( rLocalName, XML_LIST_LEVEL_PROPERTIES ) ||
438           IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) ) )
439     {
440         pContext = new SvxXMLListLevelStyleAttrContext_Impl( GetImport(),
441                                                              nPrefix,
442                                                              rLocalName,
443                                                              xAttrList,
444                                                              *this );
445     }
446     else if( (XML_NAMESPACE_OFFICE == nPrefix) && xmloff::token::IsXMLToken( rLocalName,
447                                         xmloff::token::XML_BINARY_DATA ) )
448     {
449         if( bImage && !sImageURL.getLength() && !xBase64Stream.is() )
450         {
451             xBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
452             if( xBase64Stream.is() )
453                 pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
454                                                     rLocalName, xAttrList,
455                                                     xBase64Stream );
456         }
457     }
458     if( !pContext )
459     {
460         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
461     }
462 
463     return pContext;
464 }
465 
GetProperties(const SvI18NMap * pI18NMap)466 Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties(
467         const SvI18NMap *pI18NMap )
468 {
469     sal_Int16 eType = NumberingType::NUMBER_NONE;
470 
471     sal_Int32 nCount = 0;
472     if( bBullet )
473     {
474         eType = NumberingType::CHAR_SPECIAL;
475         nCount = cBullet ? 15 : 14;
476     }
477     if( bImage )
478     {
479         eType = NumberingType::BITMAP;
480         nCount = 15;
481 
482         if( (sImageURL.getLength() > 0L) || xBase64Stream.is() )
483             nCount++;
484     }
485     if( bNum )
486     {
487         eType = NumberingType::ARABIC;
488         GetImport().GetMM100UnitConverter().convertNumFormat(
489                 eType, sNumFormat, sNumLetterSync, sal_True );
490         nCount = 15;
491     }
492 
493     if( ( bBullet || bNum ) && nRelSize )
494         nCount++;
495 
496     if( !bImage && bHasColor )
497     {
498         nCount++;
499     }
500 
501     if (bBullet && sSuffix.getLength())
502     {
503         sal_uInt16 const nVersion(GetImport().getGeneratorVersion());
504         sal_Int32 nUPD;
505         sal_Int32 nBuildId;
506         if (GetImport().getBuildIds(nUPD, nBuildId)
507             && (   (SvXMLImport::OOo_1x == nVersion)
508                 || (SvXMLImport::OOo_2x == nVersion)
509                 || (310 == nUPD) || (320 == nUPD) || (330 == nUPD)
510                 || ((300 == nUPD) && (nBuildId <= 9573))))
511         {
512             // #i93908# OOo < 3.4 wrote a bogus suffix for bullet chars
513             sSuffix = ::rtl::OUString(); // clear it
514         }
515     }
516 
517     Sequence<beans::PropertyValue> aPropSeq( nCount );
518     if( nCount > 0 )
519     {
520         beans::PropertyValue *pProps = aPropSeq.getArray();
521         sal_Int32 nPos = 0;
522         pProps[nPos].Name =
523                 OUString::createFromAscii( XML_UNO_NAME_NRULE_NUMBERINGTYPE );
524         pProps[nPos++].Value <<= (sal_Int16)eType ;
525 
526         pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_PREFIX );
527         pProps[nPos++].Value <<= sPrefix;
528 
529         pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_SUFFIX );
530         pProps[nPos++].Value <<= sSuffix;
531 
532         pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_ADJUST );
533         pProps[nPos++].Value <<= eAdjust;
534 
535         sal_Int32 nLeftMargin = nSpaceBefore + nMinLabelWidth;
536         pProps[nPos].Name =
537             OUString::createFromAscii( XML_UNO_NAME_NRULE_LEFT_MARGIN );
538         pProps[nPos++].Value <<= (sal_Int32)nLeftMargin;
539 
540         sal_Int32 nFirstLineOffset = -nMinLabelWidth;
541 
542         pProps[nPos].Name =
543                 OUString::createFromAscii( XML_UNO_NAME_NRULE_FIRST_LINE_OFFSET );
544         pProps[nPos++].Value <<= (sal_Int32)nFirstLineOffset;
545 
546         pProps[nPos].Name =
547             OUString::createFromAscii(XML_UNO_NAME_NRULE_SYMBOL_TEXT_DISTANCE);
548         pProps[nPos++].Value <<= (sal_Int16)nMinLabelDist;
549 
550         // --> OD 2008-01-16 #newlistlevelattrs#
551         pProps[nPos].Name =
552             OUString::createFromAscii(XML_UNO_NAME_NRULE_POSITION_AND_SPACE_MODE);
553         pProps[nPos++].Value <<= (sal_Int16)ePosAndSpaceMode;
554         pProps[nPos].Name =
555             OUString::createFromAscii(XML_UNO_NAME_NRULE_LABEL_FOLLOWED_BY);
556         pProps[nPos++].Value <<= (sal_Int16)eLabelFollowedBy;
557         pProps[nPos].Name =
558             OUString::createFromAscii(XML_UNO_NAME_NRULE_LISTTAB_STOP_POSITION);
559         pProps[nPos++].Value <<= (sal_Int32)nListtabStopPosition;
560         pProps[nPos].Name =
561             OUString::createFromAscii(XML_UNO_NAME_NRULE_FIRST_LINE_INDENT);
562         pProps[nPos++].Value <<= (sal_Int32)nFirstLineIndent;
563         pProps[nPos].Name =
564             OUString::createFromAscii(XML_UNO_NAME_NRULE_INDENT_AT);
565         pProps[nPos++].Value <<= (sal_Int32)nIndentAt;
566         // <--
567 
568         OUString sDisplayTextStyleName = GetImport().GetStyleDisplayName(
569                                 XML_STYLE_FAMILY_TEXT_TEXT, sTextStyleName  );
570         OUString sStyleName = sDisplayTextStyleName;
571         if( sStyleName.getLength() && pI18NMap )
572             sStyleName = pI18NMap->Get( SFX_STYLE_FAMILY_CHAR, sStyleName );
573         pProps[nPos].Name =
574                 OUString::createFromAscii( XML_UNO_NAME_NRULE_CHAR_STYLE_NAME );
575         pProps[nPos++].Value <<= sDisplayTextStyleName;
576 
577         if( bBullet )
578         {
579             awt::FontDescriptor aFDesc;
580             aFDesc.Name = sBulletFontName;
581             if( sBulletFontName.getLength() )
582             {
583                 aFDesc.StyleName = sBulletFontStyleName;
584                 aFDesc.Family = eBulletFontFamily;
585                 aFDesc.Pitch = eBulletFontPitch;
586                 aFDesc.CharSet = eBulletFontEncoding;
587                 aFDesc.Weight = WEIGHT_DONTKNOW;
588                 //aFDesc.Transparant = sal_True;
589                 sal_Bool bStarSymbol = sal_False;
590                 if( aFDesc.Name.equalsIgnoreAsciiCase( sStarBats ) )
591                 {
592                     cBullet = GetImport().ConvStarBatsCharToStarSymbol( cBullet );
593                     bStarSymbol = sal_True;
594                 }
595                 else if( aFDesc.Name.equalsIgnoreAsciiCase( sStarMath ) )
596                 {
597                     cBullet = GetImport().ConvStarMathCharToStarSymbol( cBullet );
598                     bStarSymbol = sal_True;
599                 }
600                 if( bStarSymbol )
601                     aFDesc.Name =
602                         OUString( RTL_CONSTASCII_USTRINGPARAM("StarSymbol" ) );
603             }
604 
605             if( cBullet )
606             {
607                 OUStringBuffer sTmp(1);
608                 sTmp.append( cBullet );
609                 pProps[nPos].Name =
610                         OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_CHAR );
611                 pProps[nPos++].Value <<= sTmp.makeStringAndClear();
612             }
613 
614             pProps[nPos].Name =
615                     OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_FONT );
616             pProps[nPos++].Value <<= aFDesc;
617 
618         }
619 
620         if( bImage )
621         {
622             OUString sStr( sImageURL );
623             if( sImageURL.getLength() )
624             {
625                 sStr = GetImport().ResolveGraphicObjectURL( sImageURL,
626                                                                  sal_False );
627             }
628             else if( xBase64Stream.is() )
629             {
630                 sStr = GetImport().ResolveGraphicObjectURLFromBase64( xBase64Stream );
631 //              xBase64Stream = 0;
632             }
633 
634             if( sStr.getLength() )
635             {
636                 pProps[nPos].Name =
637                         OUString::createFromAscii( XML_UNO_NAME_NRULE_GRAPHICURL );
638                 pProps[nPos++].Value <<= sStr;
639             }
640 
641             awt::Size aSize( nImageWidth, nImageHeight );
642             pProps[nPos].Name =
643                 OUString::createFromAscii( XML_UNO_NAME_NRULE_GRAPHIC_SIZE );
644             pProps[nPos++].Value <<= aSize;
645 
646             pProps[nPos].Name =
647                 OUString::createFromAscii( XML_UNO_NAME_NRULE_VERT_ORIENT );
648             pProps[nPos++].Value <<= (sal_Int16)eImageVertOrient;
649         }
650 
651         if( bNum )
652         {
653             pProps[nPos].Name =
654                     OUString::createFromAscii( XML_UNO_NAME_NRULE_START_WITH );
655             pProps[nPos++].Value <<= (sal_Int16)nNumStartValue;
656 
657             pProps[nPos].Name =
658                 OUString::createFromAscii(XML_UNO_NAME_NRULE_PARENT_NUMBERING);
659             pProps[nPos++].Value <<= (sal_Int16)nNumDisplayLevels;
660         }
661 
662         if( ( bNum || bBullet ) && nRelSize )
663         {
664             pProps[nPos].Name =
665                 OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_RELSIZE );
666             pProps[nPos++].Value <<= nRelSize;
667         }
668 
669         if( !bImage && bHasColor )
670         {
671             pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_COLOR );
672             pProps[nPos++].Value <<= (sal_Int32)aColor.GetColor();
673         }
674 
675         DBG_ASSERT( nPos == nCount, "array under/overflow" );
676     }
677 
678     return aPropSeq;
679 }
680 
681 // ---------------------------------------------------------------------
682 
683 enum SvxXMLStyleAttributesAttrTokens
684 {
685     XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE,
686     XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH,
687     XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST,
688     XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN,
689     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME,
690     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY,
691     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC,
692     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME,
693     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH,
694     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET,
695     XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS,
696     XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL,
697     XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH,
698     XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT,
699     XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR,
700     XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR,
701     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE,
702     // --> OD 2008-01-16 #newlistlevelattrs#
703     XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE,
704     // <--
705 
706     XML_TOK_STYLE_ATTRIBUTES_ATTR_END=XML_TOK_UNKNOWN
707 };
lcl_getStyleAttributesAttrTokenMap()708 const SvXMLTokenMapEntry* lcl_getStyleAttributesAttrTokenMap()
709 {
710     static __FAR_DATA SvXMLTokenMapEntry aStyleAttributesAttrTokenMap[] =
711     {
712         { XML_NAMESPACE_TEXT, XML_SPACE_BEFORE,
713                 XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE },
714         { XML_NAMESPACE_TEXT, XML_MIN_LABEL_WIDTH,
715                 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH },
716         { XML_NAMESPACE_TEXT, XML_MIN_LABEL_DISTANCE,
717                 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST },
718         { XML_NAMESPACE_FO, XML_TEXT_ALIGN,
719                 XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN },
720         { XML_NAMESPACE_STYLE, XML_FONT_NAME,
721                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME },
722         { XML_NAMESPACE_FO, XML_FONT_FAMILY,
723                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY },
724         { XML_NAMESPACE_STYLE, XML_FONT_FAMILY_GENERIC,
725                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC },
726         { XML_NAMESPACE_STYLE, XML_FONT_STYLE_NAME,
727                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME },
728         { XML_NAMESPACE_STYLE, XML_FONT_PITCH,
729                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH },
730         { XML_NAMESPACE_STYLE, XML_FONT_CHARSET,
731                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET },
732         { XML_NAMESPACE_STYLE, XML_VERTICAL_POS,
733                 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS },
734         { XML_NAMESPACE_STYLE, XML_VERTICAL_REL,
735                 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL },
736         { XML_NAMESPACE_FO, XML_WIDTH,
737                 XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH },
738         { XML_NAMESPACE_FO, XML_HEIGHT,
739                 XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT },
740         { XML_NAMESPACE_FO, XML_COLOR,
741                 XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR },
742         { XML_NAMESPACE_STYLE, XML_USE_WINDOW_FONT_COLOR,
743                 XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR },
744         { XML_NAMESPACE_FO, XML_FONT_SIZE,
745                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE },
746         // --> OD 2008-01-16 #newlistlevelattrs#
747         { XML_NAMESPACE_TEXT, XML_LIST_LEVEL_POSITION_AND_SPACE_MODE,
748                 XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE },
749         // <--
750 
751         XML_TOKEN_MAP_END
752     };
753     return aStyleAttributesAttrTokenMap;
754 }
SvxXMLListLevelStyleAttrContext_Impl(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<xml::sax::XAttributeList> & xAttrList,SvxXMLListLevelStyleContext_Impl & rLLevel)755 SvxXMLListLevelStyleAttrContext_Impl::SvxXMLListLevelStyleAttrContext_Impl(
756         SvXMLImport& rImport, sal_uInt16 nPrfx,
757         const OUString& rLName,
758         const Reference< xml::sax::XAttributeList > & xAttrList,
759         SvxXMLListLevelStyleContext_Impl& rLLevel ) :
760     SvXMLImportContext( rImport, nPrfx, rLName ),
761     rListLevel( rLLevel )
762 {
763     SvXMLTokenMap aTokenMap( lcl_getStyleAttributesAttrTokenMap() );
764     SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
765 
766     OUString sFontName, sFontFamily, sFontStyleName, sFontFamilyGeneric,
767              sFontPitch, sFontCharset;
768     OUString sVerticalPos, sVerticalRel;
769 
770     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
771     for( sal_Int16 i=0; i < nAttrCount; i++ )
772     {
773         const OUString& rAttrName = xAttrList->getNameByIndex( i );
774         OUString aLocalName;
775         sal_uInt16 nPrefix =
776             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
777                                                             &aLocalName );
778         const OUString& rValue = xAttrList->getValueByIndex( i );
779 
780         sal_Int32 nVal;
781         switch( aTokenMap.Get( nPrefix, aLocalName ) )
782         {
783         case XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE:
784             if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) )
785                 rListLevel.SetSpaceBefore( nVal );
786             break;
787         case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH:
788             if( rUnitConv.convertMeasure( nVal, rValue, 0, SHRT_MAX ) )
789                 rListLevel.SetMinLabelWidth( nVal );
790             break;
791         case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST:
792             if( rUnitConv.convertMeasure( nVal, rValue, 0, USHRT_MAX ) )
793                 rListLevel.SetMinLabelDist( nVal );
794             break;
795         case XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN:
796             if( rValue.getLength() )
797             {
798                 sal_Int16 eAdjust = HoriOrientation::LEFT;
799                 if( IsXMLToken( rValue, XML_CENTER ) )
800                     eAdjust = HoriOrientation::CENTER;
801                 else if( IsXMLToken( rValue, XML_END ) )
802                     eAdjust = HoriOrientation::RIGHT;
803                 rListLevel.SetAdjust( eAdjust );
804             }
805             break;
806         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME:
807             sFontName = rValue;
808             break;
809         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY:
810             sFontFamily = rValue;
811             break;
812         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC:
813             sFontFamilyGeneric = rValue;
814             break;
815         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME:
816             sFontStyleName = rValue;
817             break;
818         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH:
819             sFontPitch = rValue;
820             break;
821         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET:
822             sFontCharset = rValue;
823             break;
824         case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS:
825             sVerticalPos = rValue;
826             break;
827         case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL:
828             sVerticalRel = rValue;
829             break;
830         case XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH:
831             if( rUnitConv.convertMeasure( nVal, rValue, 0, SAL_MAX_INT32) )
832                 rListLevel.SetImageWidth( nVal );
833             break;
834         case XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT:
835             if( rUnitConv.convertMeasure( nVal, rValue, 0, SAL_MAX_INT32) )
836                 rListLevel.SetImageHeight( nVal );
837             break;
838         case XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR:
839             {
840                 Color aColor;
841                 if( SvXMLUnitConverter::convertColor( aColor, rValue ) )
842                     rListLevel.SetColor( (sal_Int32)aColor.GetColor() );
843             }
844             break;
845         case XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR:
846             {
847                 if( IsXMLToken( rValue, XML_TRUE ) )
848                     rListLevel.SetColor( (sal_Int32)0xffffffff );
849             }
850             break;
851         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE:
852             if(SvXMLUnitConverter::convertPercent( nVal, rValue ) )
853                 rListLevel.SetRelSize( (sal_Int16)nVal );
854             break;
855         // --> OD 2008-01-16 #newlistlevelattrs#
856         case XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE:
857             {
858                 sal_Int16 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION;
859                 if( IsXMLToken( rValue, XML_LABEL_ALIGNMENT ) )
860                     ePosAndSpaceMode = PositionAndSpaceMode::LABEL_ALIGNMENT;
861                 rListLevel.SetPosAndSpaceMode( ePosAndSpaceMode );
862             }
863             break;
864         // <--
865         }
866     }
867 
868     if( sFontName.getLength() )
869     {
870         const XMLFontStylesContext *pFontDecls =
871             GetImport().GetTextImport()->GetFontDecls();
872         if( pFontDecls )
873         {
874             ::std::vector < XMLPropertyState > aProps;
875             if( pFontDecls->FillProperties( sFontName, aProps, 0, 1, 2, 3, 4 ) )
876             {
877                 OUString sTmp;
878                 sal_Int16 nTmp = 0;
879                 ::std::vector< XMLPropertyState >::iterator i;
880                 for( i = aProps.begin(); i != aProps.end(); i++ )
881                 {
882                     switch( i->mnIndex )
883                     {
884                     case 0:
885                         i->maValue >>= sTmp;
886                         rListLevel.SetBulletFontName( sTmp);
887                         break;
888                     case 1:
889                         i->maValue >>= sTmp;
890                         rListLevel.SetBulletFontStyleName( sTmp );
891                         break;
892                     case 2:
893                         i->maValue >>= nTmp;
894                         rListLevel.SetBulletFontFamily( nTmp );
895                         break;
896                     case 3:
897                         i->maValue >>= nTmp;
898                         rListLevel.SetBulletFontPitch( nTmp );
899                         break;
900                     case 4:
901                         i->maValue >>= nTmp;
902                         rListLevel.SetBulletFontEncoding( nTmp );
903                         break;
904                     }
905                 }
906             }
907         }
908     }
909     if( sFontFamily.getLength() )
910     {
911         String sEmpty;
912         Any aAny;
913 
914         XMLFontFamilyNamePropHdl aFamilyNameHdl;
915         if( aFamilyNameHdl.importXML( sFontFamily, aAny, rUnitConv ) )
916         {
917             OUString sTmp;
918             aAny >>= sTmp;
919             rListLevel.SetBulletFontName( sTmp);
920         }
921 
922         XMLFontFamilyPropHdl aFamilyHdl;
923         if( sFontFamilyGeneric.getLength() &&
924             aFamilyHdl.importXML( sFontFamilyGeneric, aAny, rUnitConv  ) )
925         {
926             sal_Int16 nTmp = 0;
927             aAny >>= nTmp;
928             rListLevel.SetBulletFontFamily( nTmp );
929         }
930 
931         if( sFontStyleName.getLength() )
932             rListLevel.SetBulletFontStyleName( sFontStyleName );
933 
934         XMLFontPitchPropHdl aPitchHdl;
935         if( sFontPitch.getLength() &&
936             aPitchHdl.importXML( sFontPitch, aAny, rUnitConv  ) )
937         {
938             sal_Int16 nTmp = 0;
939             aAny >>= nTmp;
940             rListLevel.SetBulletFontPitch( nTmp );
941         }
942 
943         XMLFontEncodingPropHdl aEncHdl;
944         if( sFontCharset.getLength() &&
945             aEncHdl.importXML( sFontCharset, aAny, rUnitConv  ) )
946         {
947             sal_Int16 nTmp = 0;
948             aAny >>= nTmp;
949             rListLevel.SetBulletFontEncoding( nTmp );
950         }
951     }
952 
953     sal_Int16 eVertOrient = VertOrientation::LINE_CENTER;
954     if( sVerticalPos.getLength() )
955     {
956         if( IsXMLToken( sVerticalPos, XML_TOP ) )
957             eVertOrient = VertOrientation::LINE_TOP;
958         else if( IsXMLToken( sVerticalPos, XML_BOTTOM ) )
959             eVertOrient = VertOrientation::LINE_BOTTOM;
960     }
961     if( sVerticalRel.getLength() )
962     {
963         if( IsXMLToken( sVerticalRel, XML_BASELINE ) )
964         {
965             // TOP and BOTTOM are exchanged for a baseline relation
966             switch( eVertOrient  )
967             {
968             case VertOrientation::LINE_TOP:
969                 eVertOrient = VertOrientation::BOTTOM;
970                 break;
971             case VertOrientation::LINE_CENTER:
972                 eVertOrient = VertOrientation::CENTER;
973                 break;
974             case VertOrientation::LINE_BOTTOM:
975                 eVertOrient = VertOrientation::TOP;
976                 break;
977             }
978         }
979         else if( IsXMLToken( sVerticalRel, XML_CHAR ) )
980         {
981             switch( eVertOrient  )
982             {
983             case VertOrientation::LINE_TOP:
984                 eVertOrient = VertOrientation::CHAR_TOP;
985                 break;
986             case VertOrientation::LINE_CENTER:
987                 eVertOrient = VertOrientation::CHAR_CENTER;
988                 break;
989             case VertOrientation::LINE_BOTTOM:
990                 eVertOrient = VertOrientation::CHAR_BOTTOM;
991                 break;
992             }
993         }
994     }
995     rListLevel.SetImageVertOrient( eVertOrient );
996 }
997 
~SvxXMLListLevelStyleAttrContext_Impl()998 SvxXMLListLevelStyleAttrContext_Impl::~SvxXMLListLevelStyleAttrContext_Impl()
999 {
1000 }
1001 
1002 // --> OD 2008-01-16 #newlistlevelattrs#
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList)1003 SvXMLImportContext* SvxXMLListLevelStyleAttrContext_Impl::CreateChildContext(
1004         sal_uInt16 nPrefix, const OUString& rLocalName,
1005         const Reference< xml::sax::XAttributeList > & xAttrList )
1006 {
1007     SvXMLImportContext *pContext = 0;
1008     if ( XML_NAMESPACE_STYLE == nPrefix &&
1009          IsXMLToken( rLocalName, XML_LIST_LEVEL_LABEL_ALIGNMENT ) )
1010     {
1011         pContext = new SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl( GetImport(),
1012                                                              nPrefix,
1013                                                              rLocalName,
1014                                                              xAttrList,
1015                                                              rListLevel );
1016     }
1017     if( !pContext )
1018     {
1019         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1020     }
1021 
1022     return pContext;
1023 }
1024 // <--
1025 
1026 // ---------------------------------------------------------------------
1027 
1028 // --> OD 2008-01-16 #newlistlevelattrs#
1029 enum SvxXMLStyleAttributesLabelAlignmentAttrTokens
1030 {
1031     XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY,
1032     XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION,
1033     XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT,
1034     XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT,
1035 
1036     XML_TOK_STYLE_ATTRIBUTES_LABEL_ALIGNMENT_ATTR_END=XML_TOK_UNKNOWN
1037 };
lcl_getStyleAlignmentAttributesAttrTokenMap()1038 const SvXMLTokenMapEntry* lcl_getStyleAlignmentAttributesAttrTokenMap()
1039 {
1040     static __FAR_DATA SvXMLTokenMapEntry aStyleAlignmentAttributesAttrTokenMap[] =
1041     {
1042         { XML_NAMESPACE_TEXT, XML_LABEL_FOLLOWED_BY,
1043                 XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY },
1044         { XML_NAMESPACE_TEXT, XML_LIST_TAB_STOP_POSITION,
1045                 XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION },
1046         { XML_NAMESPACE_FO, XML_TEXT_INDENT,
1047                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT },
1048         { XML_NAMESPACE_FO, XML_MARGIN_LEFT,
1049                 XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT },
1050 
1051         XML_TOKEN_MAP_END
1052     };
1053     return aStyleAlignmentAttributesAttrTokenMap;
1054 }
SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<xml::sax::XAttributeList> & xAttrList,SvxXMLListLevelStyleContext_Impl & rLLevel)1055 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(
1056         SvXMLImport& rImport, sal_uInt16 nPrfx,
1057         const OUString& rLName,
1058         const Reference< xml::sax::XAttributeList > & xAttrList,
1059         SvxXMLListLevelStyleContext_Impl& rLLevel ) :
1060     SvXMLImportContext( rImport, nPrfx, rLName ),
1061     rListLevel( rLLevel )
1062 {
1063     SvXMLTokenMap aTokenMap( lcl_getStyleAlignmentAttributesAttrTokenMap() );
1064     SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
1065 
1066     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1067     for( sal_Int16 i=0; i < nAttrCount; i++ )
1068     {
1069         const OUString& rAttrName = xAttrList->getNameByIndex( i );
1070         OUString aLocalName;
1071         sal_uInt16 nPrefix =
1072             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
1073                                                             &aLocalName );
1074         const OUString& rValue = xAttrList->getValueByIndex( i );
1075 
1076         sal_Int32 nVal;
1077         switch( aTokenMap.Get( nPrefix, aLocalName ) )
1078         {
1079         case XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY:
1080             {
1081                 sal_Int16 eLabelFollowedBy = LabelFollow::LISTTAB;
1082                 if( IsXMLToken( rValue, XML_SPACE ) )
1083                     eLabelFollowedBy = LabelFollow::SPACE;
1084                 else if( IsXMLToken( rValue, XML_NOTHING ) )
1085                     eLabelFollowedBy = LabelFollow::NOTHING;
1086                 rListLevel.SetLabelFollowedBy( eLabelFollowedBy );
1087             }
1088             break;
1089         case XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION:
1090             if( rUnitConv.convertMeasure( nVal, rValue, 0, SHRT_MAX ) )
1091                 rListLevel.SetListtabStopPosition( nVal );
1092             break;
1093         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT:
1094             if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) )
1095                 rListLevel.SetFirstLineIndent( nVal );
1096             break;
1097         case XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT:
1098             if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) )
1099                 rListLevel.SetIndentAt( nVal );
1100             break;
1101         }
1102     }
1103 }
1104 
~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl()1105 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl()
1106 {
1107 }
1108 // <--
1109 
1110 // ---------------------------------------------------------------------
1111 
1112 typedef SvxXMLListLevelStyleContext_Impl *SvxXMLListLevelStyleContext_ImplPtr;
1113 SV_DECL_PTRARR( SvxXMLListStyle_Impl, SvxXMLListLevelStyleContext_ImplPtr,
1114                 10, 5 )
1115 
SetAttribute(sal_uInt16 nPrefixKey,const OUString & rLocalName,const OUString & rValue)1116 void SvxXMLListStyleContext::SetAttribute( sal_uInt16 nPrefixKey,
1117                                            const OUString& rLocalName,
1118                                            const OUString& rValue )
1119 {
1120     if( XML_NAMESPACE_TEXT == nPrefixKey &&
1121         IsXMLToken( rLocalName, XML_CONSECUTIVE_NUMBERING ) )
1122     {
1123         bConsecutive = IsXMLToken( rValue, XML_TRUE );
1124     }
1125     else
1126     {
1127         SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
1128     }
1129 }
1130 
1131 
SvxXMLListStyleContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<xml::sax::XAttributeList> & xAttrList,sal_Bool bOutl)1132 SvxXMLListStyleContext::SvxXMLListStyleContext( SvXMLImport& rImport,
1133         sal_uInt16 nPrfx,
1134         const OUString& rLName,
1135         const Reference< xml::sax::XAttributeList > & xAttrList,
1136         sal_Bool bOutl )
1137 :   SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, bOutl ? XML_STYLE_FAMILY_TEXT_OUTLINE : XML_STYLE_FAMILY_TEXT_LIST )
1138 ,   sIsPhysical( RTL_CONSTASCII_USTRINGPARAM( "IsPhysical" ) )
1139 ,   sNumberingRules( RTL_CONSTASCII_USTRINGPARAM( "NumberingRules" ) )
1140 ,   sName( RTL_CONSTASCII_USTRINGPARAM( "Name" ) )
1141 ,   sIsContinuousNumbering( RTL_CONSTASCII_USTRINGPARAM( "IsContinuousNumbering" ) )
1142 ,   pLevelStyles( 0 )
1143 ,   nLevels( 0 )
1144 ,   bConsecutive( sal_False )
1145 ,   bOutline( bOutl )
1146 {
1147 }
1148 
~SvxXMLListStyleContext()1149 SvxXMLListStyleContext::~SvxXMLListStyleContext()
1150 {
1151     if( pLevelStyles )
1152     {
1153         while( pLevelStyles->Count() )
1154         {
1155             sal_uInt16 n = pLevelStyles->Count() - 1;
1156             SvxXMLListLevelStyleContext_Impl *pStyle = (*pLevelStyles)[n];
1157             pLevelStyles->Remove( n, 1 );
1158             pStyle->ReleaseRef();
1159         }
1160     }
1161 
1162     delete pLevelStyles;
1163 }
1164 
1165 TYPEINIT1( SvxXMLListStyleContext, SvXMLStyleContext );
1166 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList)1167 SvXMLImportContext *SvxXMLListStyleContext::CreateChildContext(
1168         sal_uInt16 nPrefix,
1169         const OUString& rLocalName,
1170         const Reference< xml::sax::XAttributeList > & xAttrList )
1171 {
1172     SvXMLImportContext *pContext = 0;
1173 
1174     if( XML_NAMESPACE_TEXT == nPrefix &&
1175         ( bOutline
1176             ? IsXMLToken( rLocalName, XML_OUTLINE_LEVEL_STYLE )
1177             : ( IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
1178                 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_BULLET ) ||
1179                 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_IMAGE )    ) ) )
1180     {
1181         SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1182             new SvxXMLListLevelStyleContext_Impl( GetImport(), nPrefix,
1183                                                   rLocalName, xAttrList );
1184         if( !pLevelStyles )
1185             pLevelStyles = new SvxXMLListStyle_Impl;
1186         pLevelStyles->Insert( pLevelStyle, pLevelStyles->Count() );
1187         pLevelStyle->AddRef();
1188 
1189         pContext = pLevelStyle;
1190     }
1191     else
1192     {
1193         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1194     }
1195 
1196     return pContext;
1197 }
1198 
FillUnoNumRule(const Reference<container::XIndexReplace> & rNumRule,const SvI18NMap * pI18NMap) const1199 void SvxXMLListStyleContext::FillUnoNumRule(
1200         const Reference< container::XIndexReplace > & rNumRule,
1201         const SvI18NMap *pI18NMap ) const
1202 {
1203     try
1204     {
1205         if( pLevelStyles && rNumRule.is() )
1206         {
1207             sal_uInt16 nCount = pLevelStyles->Count();
1208             sal_Int32 l_nLevels = rNumRule->getCount();
1209             for( sal_uInt16 i=0; i < nCount; i++ )
1210             {
1211                 SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1212                     (*pLevelStyles)[i];
1213                 sal_Int32 nLevel = pLevelStyle->GetLevel();
1214                 if( nLevel >= 0 && nLevel < l_nLevels )
1215                 {
1216                     Sequence<beans::PropertyValue> aProps =
1217                         pLevelStyle->GetProperties( pI18NMap );
1218                     Any aAny;
1219                     aAny <<= aProps;
1220                     // Validate any URLs
1221                     for( sal_Int32 j = 0; j < aProps.getLength(); j++ ) {
1222                         if ( aProps[ j ].Name.equalsAscii( "GraphicURL" ) ) {
1223                             OUString aURL;
1224                             aProps[ j ].Value >>= aURL;
1225                             uno::Reference< com::sun::star::document::XLinkAuthorizer > xLinkAuthorizer( GetImport().GetModel(), uno::UNO_QUERY );
1226                             if ( xLinkAuthorizer.is() ) {
1227                                 if ( !xLinkAuthorizer->authorizeLinks( aURL ) )
1228                                     throw uno::RuntimeException();
1229                             }
1230                         }
1231                     }
1232                     rNumRule->replaceByIndex( nLevel, aAny );
1233                 }
1234             }
1235         }
1236 
1237         Reference < XPropertySet > xPropSet( rNumRule, UNO_QUERY );
1238         Reference< XPropertySetInfo > xPropSetInfo;
1239         if (xPropSet.is())
1240             xPropSetInfo = xPropSet->getPropertySetInfo();
1241         if( xPropSetInfo.is() &&
1242             xPropSetInfo->hasPropertyByName( sIsContinuousNumbering ) )
1243         {
1244             Any aAny;
1245             sal_Bool bTmp = bConsecutive;
1246             aAny.setValue( &bTmp, ::getBooleanCppuType() );
1247             xPropSet->setPropertyValue( sIsContinuousNumbering, aAny );
1248         }
1249     }
1250     catch( Exception& )
1251     {
1252         DBG_ERROR( "SvxXMLListStyleContext::FillUnoNumRule - Exception catched" );
1253     }
1254 }
1255 
CreateAndInsertLate(sal_Bool bOverwrite)1256 void SvxXMLListStyleContext::CreateAndInsertLate( sal_Bool bOverwrite )
1257 {
1258     if( bOutline )
1259     {
1260         if( bOverwrite )
1261         {
1262             const Reference< XIndexReplace >& rNumRule =
1263                 GetImport().GetTextImport()->GetChapterNumbering();
1264             // We don't set xNumberingRules here, to avoid using them
1265             // as numbering rules.
1266             if( rNumRule.is() )
1267                 FillUnoNumRule( rNumRule, 0 );
1268         }
1269     }
1270     else
1271     {
1272         Reference < XStyle > xStyle;
1273         const OUString& rName = GetDisplayName();
1274         if( 0 == rName.getLength() )
1275         {
1276             SetValid( sal_False );
1277             return;
1278         }
1279 
1280         const Reference < XNameContainer >& rNumStyles =
1281                 GetImport().GetTextImport()->GetNumberingStyles();
1282         if( !rNumStyles.is() )
1283         {
1284             SetValid( sal_False );
1285             return;
1286         }
1287 
1288         sal_Bool bNew = sal_False;
1289         if( rNumStyles->hasByName( rName ) )
1290         {
1291             Any aAny = rNumStyles->getByName( rName );
1292             aAny >>= xStyle;
1293         }
1294         else
1295         {
1296             Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(),
1297                                                         UNO_QUERY );
1298             DBG_ASSERT( xFactory.is(), "no factory" );
1299             if( !xFactory.is() )
1300                 return;
1301 
1302             Reference < XInterface > xIfc = xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.NumberingStyle")) );
1303             if( !xIfc.is() )
1304                 return;
1305             Reference < XStyle > xTmp( xIfc, UNO_QUERY );
1306             xStyle = xTmp;
1307             if( !xStyle.is() )
1308                 return;
1309 
1310             Any aAny;
1311             aAny <<= xStyle;
1312             rNumStyles->insertByName( rName, aAny );
1313             bNew = sal_True;
1314         }
1315 
1316         Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
1317         Reference< XPropertySetInfo > xPropSetInfo =
1318             xPropSet->getPropertySetInfo();
1319         if( !bNew && xPropSetInfo->hasPropertyByName( sIsPhysical ) )
1320         {
1321             Any aAny = xPropSet->getPropertyValue( sIsPhysical );
1322             bNew = !*(sal_Bool *)aAny.getValue();
1323         }
1324         if( rName != GetName() )
1325             GetImport().AddStyleDisplayName( XML_STYLE_FAMILY_TEXT_LIST,
1326                                              GetName(), rName );
1327 
1328         Any aAny = xPropSet->getPropertyValue( sNumberingRules );
1329         aAny >>= xNumRules;
1330         nLevels = xNumRules->getCount();
1331         if( bOverwrite || bNew )
1332         {
1333             FillUnoNumRule( xNumRules, 0 );
1334             aAny <<= xNumRules;
1335             xPropSet->setPropertyValue( sNumberingRules, aAny );
1336         }
1337         else
1338         {
1339             SetValid( sal_False );
1340         }
1341 
1342         SetNew( bNew );
1343     }
1344 }
1345 
CreateAndInsertAuto() const1346 void SvxXMLListStyleContext::CreateAndInsertAuto() const
1347 {
1348     DBG_ASSERT( !bOutline, "Outlines cannot be inserted here" );
1349     DBG_ASSERT( !xNumRules.is(), "Numbering Rule is existing already" );
1350 
1351     const OUString& rName = GetName();
1352     if( bOutline || xNumRules.is() || 0 == rName.getLength() )
1353     {
1354         ((SvxXMLListStyleContext *)this)->SetValid( sal_False );
1355         return;
1356     }
1357 
1358     ((SvxXMLListStyleContext *)this)->xNumRules = CreateNumRule(
1359         GetImport().GetModel() );
1360     ((SvxXMLListStyleContext *)this)->nLevels = xNumRules->getCount();
1361 
1362     FillUnoNumRule( xNumRules, 0 );
1363 }
1364 
CreateNumRule(const Reference<XModel> & rModel)1365 Reference < XIndexReplace > SvxXMLListStyleContext::CreateNumRule(
1366                                 const Reference < XModel > & rModel )
1367 {
1368     Reference<XIndexReplace> xNumRule;
1369 
1370     Reference< XMultiServiceFactory > xFactory( rModel, UNO_QUERY );
1371     DBG_ASSERT( xFactory.is(), "no factory" );
1372     if( !xFactory.is() )
1373         return xNumRule;
1374 
1375     Reference < XInterface > xIfc = xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.NumberingRules")) );
1376     if( !xIfc.is() )
1377         return xNumRule;
1378 
1379     xNumRule = Reference<XIndexReplace>( xIfc, UNO_QUERY );
1380     DBG_ASSERT( xNumRule.is(), "go no numbering rule" );
1381 
1382     return xNumRule;
1383 }
1384 
SetDefaultStyle(const Reference<XIndexReplace> & rNumRule,sal_Int16 nLevel,sal_Bool bOrdered)1385 void SvxXMLListStyleContext::SetDefaultStyle(
1386         const Reference < XIndexReplace > & rNumRule,
1387         sal_Int16 nLevel,
1388         sal_Bool bOrdered )
1389 {
1390     Sequence<beans::PropertyValue> aPropSeq( bOrdered ? 1 : 4  );
1391     beans::PropertyValue *pProps = aPropSeq.getArray();
1392 
1393     pProps->Name =
1394                 OUString::createFromAscii( XML_UNO_NAME_NRULE_NUMBERINGTYPE );
1395     (pProps++)->Value <<= (sal_Int16)(bOrdered ? NumberingType::ARABIC
1396                                                : NumberingType::CHAR_SPECIAL );
1397     if( !bOrdered )
1398     {
1399         // TODO: Bullet-Font
1400         //aNumFmt.SetBulletFont( &SwNumRule::GetDefBulletFont() );
1401         awt::FontDescriptor aFDesc;
1402         aFDesc.Name = OUString(
1403 #if defined UNX
1404                         RTL_CONSTASCII_USTRINGPARAM( "starbats" )
1405 #else
1406                         RTL_CONSTASCII_USTRINGPARAM( "StarBats" )
1407 #endif
1408                                         );
1409         aFDesc.Family = FAMILY_DONTKNOW ;
1410         aFDesc.Pitch = PITCH_DONTKNOW ;
1411         aFDesc.CharSet = RTL_TEXTENCODING_SYMBOL ;
1412         aFDesc.Weight = WEIGHT_DONTKNOW;
1413         //aFDesc.Transparant = sal_True;
1414         pProps->Name =
1415                     OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_FONT );
1416         (pProps++)->Value <<= aFDesc;
1417 
1418         OUStringBuffer sTmp(1);
1419         sTmp.append( (sal_Unicode)(0xF000 + 149) );
1420         pProps->Name =
1421                     OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_CHAR );
1422         (pProps++)->Value <<= sTmp.makeStringAndClear();
1423         pProps->Name =
1424                 OUString::createFromAscii( XML_UNO_NAME_NRULE_CHAR_STYLE_NAME );
1425         (pProps++)->Value <<=
1426             OUString( RTL_CONSTASCII_USTRINGPARAM( "Numbering Symbols" ) );
1427     }
1428 
1429     Any aAny;
1430     aAny <<= aPropSeq;
1431     rNumRule->replaceByIndex( nLevel, aAny );
1432 }
1433 
1434