Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include "xmlimpit.hxx"
31 : :
32 : : #include <sax/tools/converter.hxx>
33 : : #include <xmloff/xmluconv.hxx>
34 : : #include <svl/itempool.hxx>
35 : : #include <svl/poolitem.hxx>
36 : : #include <svl/itemset.hxx>
37 : : #include <xmloff/attrlist.hxx>
38 : : #include <xmloff/nmspmap.hxx>
39 : : #include <xmloff/xmlnmspe.hxx>
40 : : #include <editeng/xmlcnitm.hxx>
41 : : #include <editeng/memberids.hrc>
42 : :
43 : :
44 : : #include "hintids.hxx"
45 : : #include "unomid.h"
46 : : #include <svx/unomid.hxx>
47 : : #include <editeng/lrspitem.hxx>
48 : : #include <editeng/ulspitem.hxx>
49 : : #include <editeng/shaditem.hxx>
50 : : #include <editeng/boxitem.hxx>
51 : : #include <editeng/brkitem.hxx>
52 : : #include <editeng/keepitem.hxx>
53 : : #include <editeng/brshitem.hxx>
54 : : #include "fmtpdsc.hxx"
55 : : #include "fmtornt.hxx"
56 : : #include "fmtfsize.hxx"
57 : :
58 : : #include "fmtlsplt.hxx"
59 : : #include <xmloff/prhdlfac.hxx>
60 : : #include <xmloff/xmltypes.hxx>
61 : : #include "xmlithlp.hxx"
62 : : #include <com/sun/star/uno/Any.hxx>
63 : :
64 : : using ::editeng::SvxBorderLine;
65 : : using ::rtl::OUString;
66 : : using namespace ::com::sun::star;
67 : : using namespace ::xmloff::token;
68 : : using uno::Any;
69 : :
70 : 266 : SvXMLImportItemMapper::SvXMLImportItemMapper(
71 : : SvXMLItemMapEntriesRef rMapEntries,
72 : : sal_uInt16 nUnknWhich ) :
73 : : mrMapEntries( rMapEntries ),
74 : 266 : nUnknownWhich( nUnknWhich )
75 : : {
76 : 266 : }
77 : :
78 : 266 : SvXMLImportItemMapper::~SvXMLImportItemMapper()
79 : : {
80 [ - + ]: 266 : }
81 : :
82 : : void
83 : 57 : SvXMLImportItemMapper::setMapEntries( SvXMLItemMapEntriesRef rMapEntries )
84 : : {
85 : 57 : mrMapEntries = rMapEntries;
86 : 57 : }
87 : :
88 : : /** fills the given itemset with the attributes in the given list */
89 : 57 : void SvXMLImportItemMapper::importXML( SfxItemSet& rSet,
90 : : uno::Reference< xml::sax::XAttributeList > xAttrList,
91 : : const SvXMLUnitConverter& rUnitConverter,
92 : : const SvXMLNamespaceMap& rNamespaceMap )
93 : : {
94 : 57 : sal_Int16 nAttr = xAttrList->getLength();
95 : :
96 : 57 : SvXMLAttrContainerItem *pUnknownItem = 0;
97 [ + + ]: 207 : for( sal_Int16 i=0; i < nAttr; i++ )
98 : : {
99 [ + - ][ + - ]: 150 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
100 : 150 : OUString aLocalName, aPrefix, aNamespace;
101 : : sal_uInt16 nPrefix =
102 : : rNamespaceMap.GetKeyByAttrName( rAttrName, &aPrefix, &aLocalName,
103 [ + - ]: 150 : &aNamespace );
104 [ - + ]: 150 : if( XML_NAMESPACE_XMLNS == nPrefix )
105 : 0 : continue;
106 : :
107 [ + - ][ + - ]: 150 : const OUString& rValue = xAttrList->getValueByIndex( i );
108 : :
109 : : // find a map entry for this attribute
110 [ + - ]: 150 : SvXMLItemMapEntry* pEntry = mrMapEntries->getByName( nPrefix, aLocalName );
111 : :
112 [ + - ]: 150 : if( pEntry )
113 : : {
114 : : // we have a valid map entry here, so lets use it...
115 [ + - ]: 150 : if( 0 == (pEntry->nMemberId & (MID_SW_FLAG_NO_ITEM_IMPORT|
116 : : MID_SW_FLAG_ELEMENT_ITEM_IMPORT)) )
117 : : {
118 : : // first get item from itemset
119 : 150 : const SfxPoolItem* pItem = 0;
120 : : SfxItemState eState = rSet.GetItemState( pEntry->nWhichId, sal_True,
121 [ + - ]: 150 : &pItem );
122 : :
123 : : // if its not set, try the pool
124 [ + + ][ + - ]: 150 : if(SFX_ITEM_SET != eState && SFX_WHICH_MAX > pEntry->nWhichId )
125 [ + - ]: 63 : pItem = &rSet.GetPool()->GetDefaultItem(pEntry->nWhichId);
126 : :
127 : : // do we have an item?
128 [ + - ][ + - ]: 150 : if(eState >= SFX_ITEM_DEFAULT && pItem)
129 : : {
130 [ + - ]: 150 : SfxPoolItem *pNewItem = pItem->Clone();
131 : 150 : sal_Bool bPut = sal_False;
132 : :
133 [ + + ]: 150 : if( 0 == (pEntry->nMemberId&MID_SW_FLAG_SPECIAL_ITEM_IMPORT) )
134 : : {
135 : : bPut = PutXMLValue( *pNewItem, rValue,
136 : : static_cast<sal_uInt16>( pEntry->nMemberId & MID_SW_FLAG_MASK ),
137 [ + - ]: 147 : rUnitConverter );
138 : :
139 : : }
140 : : else
141 : : {
142 : : bPut = handleSpecialItem( *pEntry, *pNewItem, rSet,
143 : : rValue, rUnitConverter,
144 [ + - ]: 3 : rNamespaceMap );
145 : : }
146 : :
147 [ + + ]: 150 : if( bPut )
148 [ + - ]: 147 : rSet.Put( *pNewItem );
149 : :
150 [ + - ][ + - ]: 150 : delete pNewItem;
151 : : }
152 : : else
153 : : {
154 : : OSL_FAIL( "Could not get a needed item for xml import!" );
155 : : }
156 : : }
157 [ # # ]: 0 : else if( 0 != (pEntry->nMemberId & MID_SW_FLAG_NO_ITEM_IMPORT) )
158 : : {
159 : : handleNoItem( *pEntry, rSet, rValue, rUnitConverter,
160 [ # # ]: 0 : rNamespaceMap );
161 : : }
162 : : }
163 [ # # ]: 0 : else if( USHRT_MAX != nUnknownWhich )
164 : : {
165 [ # # ]: 0 : if( !pUnknownItem )
166 : : {
167 : 0 : const SfxPoolItem* pItem = 0;
168 [ # # ]: 0 : if( SFX_ITEM_SET == rSet.GetItemState( nUnknownWhich, sal_True,
169 [ # # ]: 0 : &pItem ) )
170 : : {
171 [ # # ]: 0 : SfxPoolItem *pNew = pItem->Clone();
172 [ # # ][ # # ]: 0 : pUnknownItem = PTR_CAST( SvXMLAttrContainerItem, pNew );
[ # # ][ # # ]
173 : : OSL_ENSURE( pUnknownItem,
174 : : "SvXMLAttrContainerItem expected" );
175 [ # # ]: 0 : if( !pUnknownItem )
176 [ # # ][ # # ]: 0 : delete pNew;
177 : : }
178 : : else
179 : : {
180 [ # # ][ # # ]: 0 : pUnknownItem = new SvXMLAttrContainerItem( nUnknownWhich );
181 : : }
182 : : }
183 [ # # ]: 0 : if( pUnknownItem )
184 : : {
185 [ # # ]: 0 : if( XML_NAMESPACE_NONE == nPrefix )
186 [ # # ]: 0 : pUnknownItem->AddAttr( aLocalName, rValue );
187 : : else
188 : : pUnknownItem->AddAttr( aPrefix, aNamespace, aLocalName,
189 [ # # ]: 0 : rValue );
190 : : }
191 : : }
192 [ - + ][ - + ]: 150 : }
[ - + ][ + - ]
193 : :
194 [ - + ]: 57 : if( pUnknownItem )
195 : : {
196 : 0 : rSet.Put( *pUnknownItem );
197 [ # # ]: 0 : delete pUnknownItem;
198 : : }
199 : :
200 : 57 : finished(rSet, rUnitConverter);
201 : 57 : }
202 : :
203 : : /** this method is called for every item that has the
204 : : MID_SW_FLAG_SPECIAL_ITEM_IMPORT flag set */
205 : : sal_Bool
206 : 0 : SvXMLImportItemMapper::handleSpecialItem( const SvXMLItemMapEntry& /*rEntry*/,
207 : : SfxPoolItem& /*rItem*/,
208 : : SfxItemSet& /*rSet*/,
209 : : const OUString& /*rValue*/,
210 : : const SvXMLUnitConverter& /*rUnitConverter*/,
211 : : const SvXMLNamespaceMap& /*rNamespaceMap*/ )
212 : : {
213 : : OSL_FAIL( "unsuported special item in xml import" );
214 : 0 : return sal_False;
215 : : }
216 : :
217 : : /** this method is called for every item that has the
218 : : MID_SW_FLAG_NO_ITEM_IMPORT flag set */
219 : 0 : sal_Bool SvXMLImportItemMapper::handleNoItem( const SvXMLItemMapEntry& /*rEntry*/,
220 : : SfxItemSet& /*rSet*/,
221 : : const OUString& /*rValue*/,
222 : : const SvXMLUnitConverter& /*rUnitConverter*/,
223 : : const SvXMLNamespaceMap& /*rNamespaceMap*/ )
224 : : {
225 : : OSL_FAIL( "unsuported no item in xml import" );
226 : 0 : return sal_False;
227 : : }
228 : :
229 : : void
230 : 0 : SvXMLImportItemMapper::finished(SfxItemSet &, SvXMLUnitConverter const&) const
231 : : {
232 : : // nothing to do here
233 : 0 : }
234 : :
235 : :
236 : :
237 : : // put an XML-string value into an item
238 : 150 : sal_Bool SvXMLImportItemMapper::PutXMLValue(
239 : : SfxPoolItem& rItem,
240 : : const ::rtl::OUString& rValue,
241 : : sal_uInt16 nMemberId,
242 : : const SvXMLUnitConverter& rUnitConverter )
243 : : {
244 : 150 : sal_Bool bOk = sal_False;
245 : :
246 [ - - + + : 150 : switch (rItem.Which())
- - - - -
+ - + - -
- ]
247 : : {
248 : : case RES_LR_SPACE:
249 : : {
250 [ # # ][ # # ]: 0 : SvxLRSpaceItem* pLRSpace = PTR_CAST(SvxLRSpaceItem, &rItem);
251 : : OSL_ENSURE( pLRSpace != NULL, "Wrong Which-ID!" );
252 : :
253 [ # # # # ]: 0 : switch( nMemberId )
254 : : {
255 : : case MID_L_MARGIN:
256 : : case MID_R_MARGIN:
257 : : {
258 : 0 : sal_Int32 nProp = 100;
259 : 0 : sal_Int32 nAbs = 0;
260 : :
261 [ # # ]: 0 : if( rValue.indexOf( sal_Unicode('%') ) != -1 )
262 [ # # ]: 0 : bOk = ::sax::Converter::convertPercent(nProp, rValue);
263 : : else
264 [ # # ]: 0 : bOk = rUnitConverter.convertMeasureToCore(nAbs, rValue);
265 : :
266 [ # # ]: 0 : if( bOk )
267 : : {
268 [ # # # ]: 0 : switch( nMemberId )
269 : : {
270 : : case MID_L_MARGIN:
271 [ # # ]: 0 : pLRSpace->SetTxtLeft( (sal_Int32)nAbs, (sal_uInt16)nProp );
272 : 0 : break;
273 : : case MID_R_MARGIN:
274 : 0 : pLRSpace->SetRight( (sal_Int32)nAbs, (sal_uInt16)nProp );
275 : 0 : break;
276 : : }
277 : : }
278 : : }
279 : 0 : break;
280 : : case MID_FIRST_LINE_INDENT:
281 : : {
282 : 0 : sal_Int32 nProp = 100;
283 : 0 : sal_Int32 nAbs = 0;
284 : :
285 [ # # ]: 0 : if( rValue.indexOf( sal_Unicode('%') ) != -1 )
286 [ # # ]: 0 : bOk = ::sax::Converter::convertPercent(nProp, rValue);
287 : : else
288 : : bOk = rUnitConverter.convertMeasureToCore(nAbs, rValue,
289 [ # # ]: 0 : -0x7fff, 0x7fff );
290 : :
291 [ # # ]: 0 : pLRSpace->SetTxtFirstLineOfst( (short)nAbs, (sal_uInt16)nProp );
292 : : }
293 : :
294 : : case MID_FIRST_AUTO:
295 : : {
296 : 0 : bool bAutoFirst(false);
297 [ # # ]: 0 : bOk = ::sax::Converter::convertBool( bAutoFirst, rValue );
298 [ # # ]: 0 : if( bOk )
299 : 0 : pLRSpace->SetAutoFirst( bAutoFirst );
300 : : }
301 : 0 : break;
302 : :
303 : : default:
304 : : OSL_FAIL( "unknown member id!");
305 : : }
306 : : }
307 : 0 : break;
308 : :
309 : : case RES_UL_SPACE:
310 : : {
311 [ # # ][ # # ]: 0 : SvxULSpaceItem* pULSpace = PTR_CAST(SvxULSpaceItem, &rItem);
[ # # ][ # # ]
312 : : OSL_ENSURE( pULSpace != NULL, "Wrong Which-ID!" );
313 : :
314 : 0 : sal_Int32 nProp = 100;
315 : 0 : sal_Int32 nAbs = 0;
316 : :
317 [ # # ]: 0 : if( rValue.indexOf( sal_Unicode('%') ) != -1 )
318 [ # # ]: 0 : bOk = ::sax::Converter::convertPercent( nProp, rValue );
319 : : else
320 [ # # ]: 0 : bOk = rUnitConverter.convertMeasureToCore( nAbs, rValue );
321 : :
322 [ # # # ]: 0 : switch( nMemberId )
323 : : {
324 : : case MID_UP_MARGIN:
325 : 0 : pULSpace->SetUpper( (sal_uInt16)nAbs, (sal_uInt16)nProp );
326 : 0 : break;
327 : : case MID_LO_MARGIN:
328 : 0 : pULSpace->SetLower( (sal_uInt16)nAbs, (sal_uInt16)nProp );
329 : 0 : break;
330 : : default:
331 : : OSL_FAIL("unknown MemberId");
332 : : }
333 : : }
334 : 0 : break;
335 : :
336 : : case RES_SHADOW:
337 : : {
338 [ + - ][ + - ]: 3 : SvxShadowItem* pShadow = PTR_CAST(SvxShadowItem, &rItem);
[ + - ][ + - ]
339 : : OSL_ENSURE( pShadow != NULL, "Wrong Which-ID" );
340 : :
341 : 3 : sal_Bool bColorFound = sal_False;
342 : 3 : sal_Bool bOffsetFound = sal_False;
343 : :
344 [ + - ]: 3 : SvXMLTokenEnumerator aTokenEnum( rValue );
345 : :
346 : 3 : Color aColor( 128,128, 128 );
347 : 3 : pShadow->SetLocation( SVX_SHADOW_BOTTOMRIGHT );
348 : :
349 : 3 : OUString aToken;
350 [ + - ][ + + ]: 6 : while( aTokenEnum.getNextToken( aToken ) )
351 : : {
352 [ + - ][ + - ]: 3 : if( IsXMLToken( aToken, XML_NONE ) )
353 : : {
354 : 3 : pShadow->SetLocation( SVX_SHADOW_NONE );
355 : 3 : bOk = sal_True;
356 : : }
357 [ # # ][ # # ]: 0 : else if( !bColorFound && aToken.compareToAscii( "#", 1 ) == 0 )
[ # # ]
358 : : {
359 : 0 : sal_Int32 nColor(0);
360 [ # # ]: 0 : bOk = ::sax::Converter::convertColor( nColor, aToken );
361 [ # # ]: 0 : if( !bOk )
362 : 0 : return sal_False;
363 : :
364 : 0 : aColor.SetColor(nColor);
365 : 0 : bColorFound = sal_True;
366 : : }
367 [ # # ]: 0 : else if( !bOffsetFound )
368 : : {
369 : 0 : sal_Int32 nX = 0, nY = 0;
370 : :
371 [ # # ]: 0 : bOk = rUnitConverter.convertMeasureToCore( nX, aToken );
372 [ # # ][ # # ]: 0 : if( bOk && aTokenEnum.getNextToken( aToken ) )
[ # # ][ # # ]
373 [ # # ]: 0 : bOk = rUnitConverter.convertMeasureToCore( nY, aToken );
374 : :
375 [ # # ]: 0 : if( bOk )
376 : : {
377 [ # # ]: 0 : if( nX < 0 )
378 : : {
379 [ # # ]: 0 : if( nY < 0 )
380 : : {
381 : 0 : pShadow->SetLocation( SVX_SHADOW_TOPLEFT );
382 : : }
383 : : else
384 : : {
385 : 0 : pShadow->SetLocation( SVX_SHADOW_BOTTOMLEFT );
386 : : }
387 : : }
388 : : else
389 : : {
390 [ # # ]: 0 : if( nY < 0 )
391 : : {
392 : 0 : pShadow->SetLocation( SVX_SHADOW_TOPRIGHT );
393 : : }
394 : : else
395 : : {
396 : 0 : pShadow->SetLocation( SVX_SHADOW_BOTTOMRIGHT );
397 : : }
398 : : }
399 : :
400 [ # # ]: 0 : if( nX < 0 ) nX *= -1;
401 [ # # ]: 0 : if( nY < 0 ) nY *= -1;
402 : :
403 : 0 : pShadow->SetWidth( static_cast< sal_uInt16 >( (nX + nY) >> 1 ) );
404 : : }
405 : : }
406 : : }
407 : :
408 [ + - ][ + - ]: 3 : if( bOk && ( bColorFound || bOffsetFound ) )
[ - + ]
409 : : {
410 : 0 : pShadow->SetColor( aColor );
411 : : }
412 : : else
413 [ + - ]: 3 : bOk = sal_False;
414 : : }
415 : 3 : break;
416 : :
417 : : case RES_BOX:
418 : : {
419 [ + - ][ + - ]: 135 : SvxBoxItem* pBox = PTR_CAST(SvxBoxItem, &rItem);
[ + - ][ + - ]
420 : : OSL_ENSURE( pBox != NULL, "Wrong WHich-ID" );
421 : :
422 : : /** copy SvxBorderLines */
423 : 135 : SvxBorderLine* pTop = pBox->GetTop() == NULL ?
424 [ + - ][ + - ]: 135 : NULL : new SvxBorderLine( *pBox->GetTop() );
[ + + ]
425 : 135 : SvxBorderLine* pBottom = pBox->GetBottom() == NULL ?
426 [ + - ][ + - ]: 135 : NULL : new SvxBorderLine( *pBox->GetBottom() );
[ + + ]
427 : 135 : SvxBorderLine* pLeft = pBox->GetLeft() == NULL ?
428 [ + - ][ + - ]: 135 : NULL : new SvxBorderLine( *pBox->GetLeft() );
[ + + ]
429 : 135 : SvxBorderLine* pRight = pBox->GetRight() == NULL ?
430 [ + - ][ + - ]: 135 : NULL : new SvxBorderLine( *pBox->GetRight() );
[ + + ]
431 : :
432 : : sal_Int32 nTemp;
433 : :
434 [ + + + - ]: 135 : switch( nMemberId )
435 : : {
436 : : case ALL_BORDER_PADDING:
437 : : case LEFT_BORDER_PADDING:
438 : : case RIGHT_BORDER_PADDING:
439 : : case TOP_BORDER_PADDING:
440 : : case BOTTOM_BORDER_PADDING:
441 [ - + ]: 51 : if (!rUnitConverter.convertMeasureToCore( nTemp, rValue,
442 [ + - ]: 51 : 0, 0xffff ))
443 : : {
444 : 0 : return sal_False;
445 : : }
446 : :
447 [ + - ][ + - ]: 51 : if( nMemberId == LEFT_BORDER_PADDING ||
448 : : nMemberId == ALL_BORDER_PADDING )
449 [ + - ]: 51 : pBox->SetDistance( (sal_uInt16)nTemp, BOX_LINE_LEFT );
450 [ + - ][ + - ]: 51 : if( nMemberId == RIGHT_BORDER_PADDING ||
451 : : nMemberId == ALL_BORDER_PADDING )
452 [ + - ]: 51 : pBox->SetDistance( (sal_uInt16)nTemp, BOX_LINE_RIGHT );
453 [ + - ][ + - ]: 51 : if( nMemberId == TOP_BORDER_PADDING ||
454 : : nMemberId == ALL_BORDER_PADDING )
455 [ + - ]: 51 : pBox->SetDistance( (sal_uInt16)nTemp, BOX_LINE_TOP );
456 [ + - ][ + - ]: 51 : if( nMemberId == BOTTOM_BORDER_PADDING ||
457 : : nMemberId == ALL_BORDER_PADDING )
458 [ + - ]: 51 : pBox->SetDistance( (sal_uInt16)nTemp, BOX_LINE_BOTTOM);
459 : 51 : break;
460 : :
461 : : case ALL_BORDER:
462 : : case LEFT_BORDER:
463 : : case RIGHT_BORDER:
464 : : case TOP_BORDER:
465 : : case BOTTOM_BORDER:
466 : : {
467 : 51 : sal_Bool bHasStyle = sal_False;
468 : 51 : sal_Bool bHasWidth = sal_False;
469 : 51 : sal_Bool bHasColor = sal_False;
470 : :
471 : 51 : sal_uInt16 nStyle = USHRT_MAX;
472 : 51 : sal_uInt16 nWidth = 0;
473 : 51 : sal_uInt16 nNamedWidth = USHRT_MAX;
474 : :
475 : 51 : Color aColor( COL_BLACK );
476 : :
477 [ - + ]: 51 : if( !lcl_frmitems_parseXMLBorder( rValue, rUnitConverter,
478 : : bHasStyle, nStyle,
479 : : bHasWidth, nWidth, nNamedWidth,
480 [ + - ]: 51 : bHasColor, aColor ) )
481 : 0 : return sal_False;
482 : :
483 [ + - ][ + - ]: 51 : if( TOP_BORDER == nMemberId || ALL_BORDER == nMemberId )
484 : : lcl_frmitems_setXMLBorder( pTop,
485 : : bHasStyle, nStyle,
486 : : bHasWidth, nWidth, nNamedWidth,
487 [ + - ]: 51 : bHasColor, aColor );
488 : :
489 [ + - ][ + - ]: 51 : if( BOTTOM_BORDER == nMemberId || ALL_BORDER == nMemberId )
490 : : lcl_frmitems_setXMLBorder( pBottom,
491 : : bHasStyle, nStyle,
492 : : bHasWidth, nWidth, nNamedWidth,
493 [ + - ]: 51 : bHasColor, aColor );
494 : :
495 [ + - ][ + - ]: 51 : if( LEFT_BORDER == nMemberId || ALL_BORDER == nMemberId )
496 : : lcl_frmitems_setXMLBorder( pLeft,
497 : : bHasStyle, nStyle,
498 : : bHasWidth, nWidth, nNamedWidth,
499 [ + - ]: 51 : bHasColor, aColor );
500 : :
501 [ + - ][ + - ]: 51 : if( RIGHT_BORDER == nMemberId || ALL_BORDER == nMemberId )
502 : : lcl_frmitems_setXMLBorder( pRight,
503 : : bHasStyle, nStyle,
504 : : bHasWidth, nWidth, nNamedWidth,
505 [ + - ]: 51 : bHasColor, aColor );
506 : : }
507 : 51 : break;
508 : : case ALL_BORDER_LINE_WIDTH:
509 : : case LEFT_BORDER_LINE_WIDTH:
510 : : case RIGHT_BORDER_LINE_WIDTH:
511 : : case TOP_BORDER_LINE_WIDTH:
512 : : case BOTTOM_BORDER_LINE_WIDTH:
513 : : {
514 [ + - ]: 33 : SvXMLTokenEnumerator aTokenEnum( rValue );
515 : :
516 : : sal_Int32 nInWidth, nDistance, nOutWidth;
517 : :
518 : 33 : OUString aToken;
519 [ - + ][ + - ]: 33 : if( !aTokenEnum.getNextToken( aToken ) )
520 : 0 : return sal_False;
521 : :
522 [ + - ][ - + ]: 33 : if (!rUnitConverter.convertMeasureToCore(nInWidth, aToken))
523 : 0 : return sal_False;
524 : :
525 [ + - ][ - + ]: 33 : if( !aTokenEnum.getNextToken( aToken ) )
526 : 0 : return sal_False;
527 : :
528 [ + - ][ - + ]: 33 : if (!rUnitConverter.convertMeasureToCore(nDistance, aToken))
529 : 0 : return sal_False;
530 : :
531 [ + - ][ - + ]: 33 : if( !aTokenEnum.getNextToken( aToken ) )
532 : 0 : return sal_False;
533 : :
534 [ + - ][ - + ]: 33 : if (!rUnitConverter.convertMeasureToCore(nOutWidth, aToken))
535 : 0 : return sal_False;
536 : :
537 : : // #i61946: accept line style even it's not part of our "normal" set of line styles
538 : 33 : sal_uInt16 nWidth = 0;
539 : :
540 [ + - ][ + - ]: 33 : if( TOP_BORDER_LINE_WIDTH == nMemberId ||
541 : : ALL_BORDER_LINE_WIDTH == nMemberId )
542 : : lcl_frmitems_setXMLBorder( pTop, nWidth,
543 : : static_cast< sal_uInt16 >( nOutWidth ),
544 : : static_cast< sal_uInt16 >( nInWidth ),
545 [ + - ]: 33 : static_cast< sal_uInt16 >( nDistance ) );
546 : :
547 [ + - ][ + - ]: 33 : if( BOTTOM_BORDER_LINE_WIDTH == nMemberId ||
548 : : ALL_BORDER_LINE_WIDTH == nMemberId )
549 : : lcl_frmitems_setXMLBorder( pBottom, nWidth,
550 : : static_cast< sal_uInt16 >( nOutWidth ),
551 : : static_cast< sal_uInt16 >( nInWidth ),
552 [ + - ]: 33 : static_cast< sal_uInt16 >( nDistance ) );
553 : :
554 [ + - ][ + - ]: 33 : if( LEFT_BORDER_LINE_WIDTH == nMemberId ||
555 : : ALL_BORDER_LINE_WIDTH == nMemberId )
556 : : lcl_frmitems_setXMLBorder( pLeft, nWidth,
557 : : static_cast< sal_uInt16 >( nOutWidth ),
558 : : static_cast< sal_uInt16 >( nInWidth ),
559 [ + - ]: 33 : static_cast< sal_uInt16 >( nDistance ) );
560 : :
561 [ + - ][ + - ]: 33 : if( RIGHT_BORDER_LINE_WIDTH == nMemberId ||
562 : : ALL_BORDER_LINE_WIDTH == nMemberId )
563 : : lcl_frmitems_setXMLBorder( pRight, nWidth,
564 : : static_cast< sal_uInt16 >( nOutWidth ),
565 : : static_cast< sal_uInt16 >( nInWidth ),
566 [ + - ][ + - ]: 33 : static_cast< sal_uInt16 >( nDistance ) );
567 : : }
568 : 33 : break;
569 : : }
570 : :
571 [ + - ]: 135 : pBox->SetLine( pTop, BOX_LINE_TOP );
572 [ + - ]: 135 : pBox->SetLine( pBottom, BOX_LINE_BOTTOM );
573 [ + - ]: 135 : pBox->SetLine( pLeft, BOX_LINE_LEFT );
574 [ + - ]: 135 : pBox->SetLine( pRight, BOX_LINE_RIGHT );
575 : :
576 : 135 : delete pTop;
577 : 135 : delete pBottom;
578 : 135 : delete pLeft;
579 : 135 : delete pRight;
580 : :
581 : 135 : bOk = sal_True;
582 : : }
583 : 135 : break;
584 : :
585 : : case RES_BREAK:
586 : : {
587 [ # # ][ # # ]: 0 : SvxFmtBreakItem* pFmtBreak = PTR_CAST(SvxFmtBreakItem, &rItem);
[ # # ][ # # ]
588 : : OSL_ENSURE( pFmtBreak != NULL, "Wrong Which-ID" );
589 : :
590 : : sal_uInt16 eEnum;
591 : :
592 [ # # ][ # # ]: 0 : if( !rUnitConverter.convertEnum( eEnum, rValue, psXML_BreakType ) )
593 : 0 : return sal_False;
594 : :
595 [ # # ]: 0 : if( eEnum == 0 )
596 : : {
597 : 0 : pFmtBreak->SetValue( SVX_BREAK_NONE );
598 : 0 : bOk = sal_True;
599 : : }
600 : : else
601 : : {
602 [ # # # ]: 0 : switch( nMemberId )
603 : : {
604 : : case MID_BREAK_BEFORE:
605 : : pFmtBreak->SetValue( static_cast< sal_uInt16 >((eEnum == 1) ?
606 : : SVX_BREAK_COLUMN_BEFORE :
607 [ # # ]: 0 : SVX_BREAK_PAGE_BEFORE) );
608 : 0 : break;
609 : : case MID_BREAK_AFTER:
610 : : pFmtBreak->SetValue( static_cast< sal_uInt16 >((eEnum == 1) ?
611 : : SVX_BREAK_COLUMN_AFTER :
612 [ # # ]: 0 : SVX_BREAK_PAGE_AFTER) );
613 : 0 : break;
614 : : }
615 : 0 : bOk = sal_True;
616 : : }
617 : : }
618 : 0 : break;
619 : :
620 : : case RES_KEEP:
621 : : {
622 [ # # ][ # # ]: 0 : SvxFmtKeepItem* pFmtKeep = PTR_CAST(SvxFmtKeepItem, &rItem);
623 : : OSL_ENSURE( pFmtKeep != NULL, "Wrong Which-ID" );
624 : :
625 [ # # # # ]: 0 : if( IsXMLToken( rValue, XML_ALWAYS ) ||
[ # # ]
626 : 0 : IsXMLToken( rValue, XML_TRUE ) )
627 : : {
628 : 0 : pFmtKeep->SetValue( sal_True );
629 : 0 : bOk = sal_True;
630 : : }
631 [ # # # # ]: 0 : else if( IsXMLToken( rValue, XML_AUTO ) ||
[ # # ]
632 : 0 : IsXMLToken( rValue, XML_FALSE ) )
633 : : {
634 : 0 : pFmtKeep->SetValue( sal_False );
635 : 0 : bOk = sal_True;
636 : : }
637 : : }
638 : 0 : break;
639 : :
640 : : case RES_BACKGROUND:
641 : : {
642 [ # # ][ # # ]: 0 : SvxBrushItem* pBrush = PTR_CAST(SvxBrushItem, &rItem);
[ # # ][ # # ]
643 : : OSL_ENSURE( pBrush != NULL, "Wrong Which-ID" );
644 : :
645 : 0 : sal_Int32 nTempColor(0);
646 [ # # # # : 0 : switch( nMemberId )
# # ]
647 : : {
648 : : case MID_BACK_COLOR:
649 [ # # ][ # # ]: 0 : if( IsXMLToken( rValue, XML_TRANSPARENT ) )
650 : : {
651 [ # # ]: 0 : pBrush->GetColor().SetTransparency(0xff);
652 : 0 : bOk = sal_True;
653 : : }
654 [ # # ][ # # ]: 0 : else if (::sax::Converter::convertColor(nTempColor, rValue))
655 : : {
656 : 0 : Color aTempColor(nTempColor);
657 [ # # ]: 0 : aTempColor.SetTransparency(0);
658 : 0 : pBrush->SetColor( aTempColor );
659 : 0 : bOk = sal_True;
660 : : }
661 : 0 : break;
662 : :
663 : : case MID_GRAPHIC_LINK:
664 : : {
665 : 0 : SvxGraphicPosition eOldGraphicPos = pBrush->GetGraphicPos();
666 : 0 : uno::Any aAny;
667 [ # # ]: 0 : aAny <<= rValue;
668 [ # # ]: 0 : pBrush->PutValue( aAny, MID_GRAPHIC_URL );
669 [ # # # # ]: 0 : if( GPOS_NONE == eOldGraphicPos &&
[ # # ]
670 : 0 : GPOS_NONE != pBrush->GetGraphicPos() )
671 [ # # ]: 0 : pBrush->SetGraphicPos( GPOS_TILED );
672 : 0 : bOk = sal_True ;
673 : : }
674 : 0 : break;
675 : :
676 : : case MID_GRAPHIC_REPEAT:
677 : : {
678 : 0 : SvxGraphicPosition eGraphicPos = pBrush->GetGraphicPos();
679 : 0 : sal_uInt16 nPos = GPOS_NONE;
680 [ # # ]: 0 : if( rUnitConverter.convertEnum( nPos, rValue,
681 [ # # ]: 0 : psXML_BrushRepeat ) )
682 : : {
683 [ # # ][ # # ]: 0 : if( GPOS_MM != nPos || GPOS_NONE == eGraphicPos ||
[ # # ][ # # ]
684 : : GPOS_AREA == eGraphicPos || GPOS_TILED == eGraphicPos )
685 [ # # ]: 0 : pBrush->SetGraphicPos( (SvxGraphicPosition)nPos );
686 : 0 : bOk = sal_True;
687 : : }
688 : : }
689 : 0 : break;
690 : :
691 : : case MID_GRAPHIC_POSITION:
692 : : {
693 : 0 : SvxGraphicPosition ePos = GPOS_NONE, eTmp;
694 : : sal_uInt16 nTmp;
695 [ # # ]: 0 : SvXMLTokenEnumerator aTokenEnum( rValue );
696 : 0 : OUString aToken;
697 : 0 : sal_Bool bHori = sal_False, bVert = sal_False;
698 : 0 : bOk = sal_True;
699 [ # # ][ # # ]: 0 : while( bOk && aTokenEnum.getNextToken( aToken ) )
[ # # ][ # # ]
700 : : {
701 [ # # ][ # # ]: 0 : if( bHori && bVert )
702 : : {
703 : 0 : bOk = sal_False;
704 : : }
705 [ # # ]: 0 : else if( -1 != aToken.indexOf( sal_Unicode('%') ) )
706 : : {
707 : 0 : sal_Int32 nPrc = 50;
708 [ # # ][ # # ]: 0 : if (::sax::Converter::convertPercent(nPrc, aToken))
709 : : {
710 [ # # ]: 0 : if( !bHori )
711 : : {
712 : : ePos = nPrc < 25 ? GPOS_LT :
713 [ # # ][ # # ]: 0 : (nPrc < 75 ? GPOS_MM : GPOS_RB);
714 : 0 : bHori = sal_True;
715 : : }
716 : : else
717 : : {
718 : : eTmp = nPrc < 25 ? GPOS_LT:
719 [ # # ][ # # ]: 0 : (nPrc < 75 ? GPOS_LM : GPOS_LB);
720 [ # # ]: 0 : lcl_frmitems_MergeXMLVertPos( ePos, eTmp );
721 : 0 : bVert = sal_True;
722 : : }
723 : : }
724 : : else
725 : : {
726 : : // wrong percentage
727 : 0 : bOk = sal_False;
728 : : }
729 : : }
730 [ # # ][ # # ]: 0 : else if( IsXMLToken( aToken, XML_CENTER ) )
731 : : {
732 [ # # ]: 0 : if( bHori )
733 [ # # ]: 0 : lcl_frmitems_MergeXMLVertPos( ePos, GPOS_MM );
734 [ # # ]: 0 : else if ( bVert )
735 [ # # ]: 0 : lcl_frmitems_MergeXMLHoriPos( ePos, GPOS_MM );
736 : : else
737 : 0 : ePos = GPOS_MM;
738 : : }
739 [ # # ]: 0 : else if( rUnitConverter.convertEnum( nTmp, aToken,
740 [ # # ]: 0 : psXML_BrushHoriPos ) )
741 : : {
742 [ # # ]: 0 : if( bVert )
743 : : lcl_frmitems_MergeXMLHoriPos(
744 [ # # ]: 0 : ePos, (SvxGraphicPosition)nTmp );
745 [ # # ]: 0 : else if( !bHori )
746 : 0 : ePos = (SvxGraphicPosition)nTmp;
747 : : else
748 : 0 : bOk = sal_False;
749 : 0 : bHori = sal_True;
750 : : }
751 [ # # ]: 0 : else if( rUnitConverter.convertEnum( nTmp, aToken,
752 [ # # ]: 0 : psXML_BrushVertPos ) )
753 : : {
754 [ # # ]: 0 : if( bHori )
755 : : lcl_frmitems_MergeXMLVertPos(
756 [ # # ]: 0 : ePos, (SvxGraphicPosition)nTmp );
757 [ # # ]: 0 : else if( !bVert )
758 : 0 : ePos = (SvxGraphicPosition)nTmp;
759 : : else
760 : 0 : bOk = sal_False;
761 : 0 : bVert = sal_True;
762 : : }
763 : : else
764 : : {
765 : 0 : bOk = sal_False;
766 : : }
767 : : }
768 : :
769 : 0 : bOk &= GPOS_NONE != ePos;
770 [ # # ]: 0 : if( bOk )
771 [ # # ]: 0 : pBrush->SetGraphicPos( ePos );
772 : : }
773 : 0 : break;
774 : :
775 : : case MID_GRAPHIC_FILTER:
776 [ # # ][ # # ]: 0 : pBrush->SetGraphicFilter( rValue );
[ # # ]
777 : 0 : bOk = sal_True;
778 : 0 : break;
779 : : }
780 : : }
781 : 0 : break;
782 : :
783 : : case RES_PAGEDESC:
784 : : {
785 [ # # ][ # # ]: 0 : SwFmtPageDesc* pPageDesc = PTR_CAST(SwFmtPageDesc, &rItem);
786 : : OSL_ENSURE( pPageDesc != NULL, "Wrong Which-ID" );
787 : :
788 [ # # ]: 0 : if( MID_PAGEDESC_PAGENUMOFFSET==nMemberId )
789 : : {
790 : : sal_Int32 nVal;
791 : : bOk = ::sax::Converter::convertNumber(
792 [ # # ]: 0 : nVal, rValue, 0, USHRT_MAX);
793 [ # # ]: 0 : if( bOk )
794 : 0 : pPageDesc->SetNumOffset( (sal_uInt16)nVal );
795 : : }
796 : : }
797 : 0 : break;
798 : :
799 : : case RES_LAYOUT_SPLIT:
800 : : case RES_ROW_SPLIT:
801 : : {
802 [ # # ][ # # ]: 0 : SfxBoolItem* pSplit = PTR_CAST(SfxBoolItem, &rItem);
803 : : OSL_ENSURE( pSplit != NULL, "Wrong Which-ID" );
804 : :
805 [ # # # # ]: 0 : if( IsXMLToken( rValue, XML_AUTO ) ||
[ # # ]
806 : 0 : IsXMLToken( rValue, XML_TRUE ) )
807 : : {
808 : 0 : pSplit->SetValue( sal_True );
809 : 0 : bOk = sal_True;
810 : : }
811 [ # # # # ]: 0 : else if( IsXMLToken( rValue, XML_ALWAYS ) ||
[ # # ]
812 : 0 : IsXMLToken( rValue, XML_FALSE ) )
813 : : {
814 : 0 : pSplit->SetValue( sal_False );
815 : 0 : bOk = sal_True;
816 : : }
817 : : }
818 : 0 : break;
819 : :
820 : : case RES_HORI_ORIENT:
821 : : {
822 [ + - ][ + - ]: 3 : SwFmtHoriOrient* pHoriOrient = PTR_CAST(SwFmtHoriOrient, &rItem);
[ + - ][ + - ]
823 : : OSL_ENSURE( pHoriOrient != NULL, "Wrong Which-ID" );
824 : :
825 : : sal_uInt16 nValue;
826 : : bOk = rUnitConverter.convertEnum( nValue, rValue,
827 [ + - ]: 3 : aXMLTableAlignMap );
828 [ + - ]: 3 : if( bOk )
829 : 3 : pHoriOrient->SetHoriOrient( nValue );
830 : : }
831 : 3 : break;
832 : :
833 : : case RES_VERT_ORIENT:
834 : : {
835 [ # # ][ # # ]: 0 : SwFmtVertOrient* pVertOrient = PTR_CAST(SwFmtVertOrient, &rItem);
[ # # ][ # # ]
836 : : OSL_ENSURE( pVertOrient != NULL, "Wrong Which-ID" );
837 : :
838 : : sal_uInt16 nValue;
839 : : bOk = rUnitConverter.convertEnum( nValue, rValue,
840 [ # # ]: 0 : aXMLTableVAlignMap );
841 [ # # ]: 0 : if( bOk )
842 : 0 : pVertOrient->SetVertOrient( nValue );
843 : : //#i8855# text::VertOrientation::NONE is stored as empty string and should be applied here
844 [ # # ]: 0 : else if(rValue.isEmpty())
845 : : {
846 : 0 : pVertOrient->SetVertOrient( text::VertOrientation::NONE );
847 : 0 : bOk = sal_True;
848 : : }
849 : : }
850 : 0 : break;
851 : :
852 : : case RES_FRM_SIZE:
853 : : {
854 [ + - ][ + - ]: 9 : SwFmtFrmSize* pFrmSize = PTR_CAST(SwFmtFrmSize, &rItem);
[ + - ][ + - ]
855 : : OSL_ENSURE( pFrmSize != NULL, "Wrong Which-ID" );
856 : :
857 : 9 : sal_Bool bSetHeight = sal_False;
858 : 9 : sal_Bool bSetWidth = sal_False;
859 : 9 : sal_Bool bSetSizeType = sal_False;
860 : 9 : SwFrmSize eSizeType = ATT_VAR_SIZE;
861 : 9 : sal_Int32 nMin = MINLAY;
862 : :
863 [ - + - - : 9 : switch( nMemberId )
+ + - ]
864 : : {
865 : : case MID_FRMSIZE_REL_WIDTH:
866 : : {
867 : : sal_Int32 nValue;
868 [ # # ]: 0 : bOk = ::sax::Converter::convertPercent( nValue, rValue );
869 [ # # ]: 0 : if( bOk )
870 : : {
871 [ # # ]: 0 : if( nValue < 1 )
872 : 0 : nValue = 1;
873 [ # # ]: 0 : else if( nValue > 100 )
874 : 0 : nValue = 100;
875 : :
876 : 0 : pFrmSize->SetWidthPercent( (sal_Int8)nValue );
877 : : }
878 : : }
879 : 0 : break;
880 : : case MID_FRMSIZE_WIDTH:
881 : 3 : bSetWidth = sal_True;
882 : 3 : break;
883 : : case MID_FRMSIZE_MIN_HEIGHT:
884 : 0 : eSizeType = ATT_MIN_SIZE;
885 : 0 : bSetHeight = sal_True;
886 : 0 : nMin = 1;
887 : 0 : bSetSizeType = sal_True;
888 : 0 : break;
889 : : case MID_FRMSIZE_FIX_HEIGHT:
890 : 0 : eSizeType = ATT_FIX_SIZE;
891 : 0 : bSetHeight = sal_True;
892 : 0 : nMin = 1;
893 : 0 : bSetSizeType = sal_True;
894 : 0 : break;
895 : : case MID_FRMSIZE_COL_WIDTH:
896 : 3 : eSizeType = ATT_FIX_SIZE;
897 : 3 : bSetWidth = sal_True;
898 : 3 : bSetSizeType = sal_True;
899 : 3 : break;
900 : : case MID_FRMSIZE_REL_COL_WIDTH:
901 : : {
902 : 3 : sal_Int32 nPos = rValue.indexOf( (sal_Unicode)'*' );
903 [ + - ]: 3 : if( -1L != nPos )
904 : : {
905 : 3 : sal_Int32 nValue = rValue.toInt32();
906 [ - + ]: 3 : if( nValue < MINLAY )
907 : 0 : nValue = MINLAY;
908 [ - + ]: 3 : else if( nValue > USHRT_MAX )
909 : 0 : nValue = USHRT_MAX;
910 : :
911 : 3 : pFrmSize->SetWidth( (sal_uInt16)nValue );
912 : 3 : pFrmSize->SetHeightSizeType( ATT_VAR_SIZE );
913 : 3 : bOk = sal_True;
914 : : }
915 : : }
916 : 3 : break;
917 : : }
918 : :
919 : : sal_Int32 nValue;
920 [ + - ][ + + ]: 9 : if( bSetHeight || bSetWidth )
921 : : {
922 : : bOk = rUnitConverter.convertMeasureToCore(nValue, rValue, nMin,
923 [ + - ]: 6 : USHRT_MAX );
924 [ + - ]: 6 : if( bOk )
925 : : {
926 [ + - ]: 6 : if( bSetWidth )
927 : 6 : pFrmSize->SetWidth( (sal_uInt16)nValue );
928 [ - + ]: 6 : if( bSetHeight )
929 : 0 : pFrmSize->SetHeight( (sal_uInt16)nValue );
930 [ + + ]: 6 : if( bSetSizeType )
931 : 3 : pFrmSize->SetHeightSizeType( eSizeType );
932 : : }
933 : : }
934 : : }
935 : 9 : break;
936 : :
937 : : case RES_FRAMEDIR:
938 : : {
939 : : const XMLPropertyHandler* pWritingModeHandler =
940 : : XMLPropertyHandlerFactory::CreatePropertyHandler(
941 : 0 : XML_TYPE_TEXT_WRITING_MODE_WITH_DEFAULT );
942 [ # # ]: 0 : if( pWritingModeHandler != NULL )
943 : : {
944 : 0 : Any aAny;
945 : : bOk = pWritingModeHandler->importXML( rValue, aAny,
946 [ # # ]: 0 : rUnitConverter );
947 [ # # ]: 0 : if( bOk )
948 [ # # ]: 0 : bOk = rItem.PutValue( aAny );
949 : :
950 [ # # ][ # # ]: 0 : delete pWritingModeHandler;
951 : : }
952 : : }
953 : 0 : break;
954 : :
955 : : case RES_COLLAPSING_BORDERS:
956 : : {
957 [ # # ][ # # ]: 0 : SfxBoolItem* pBorders = PTR_CAST(SfxBoolItem, &rItem);
958 : : OSL_ENSURE( pBorders != NULL, "Wrong Which-ID" );
959 : :
960 [ # # ]: 0 : if( IsXMLToken( rValue, XML_COLLAPSING ) )
961 : : {
962 : 0 : pBorders->SetValue( sal_True );
963 : 0 : bOk = sal_True;
964 : : }
965 [ # # ]: 0 : else if( IsXMLToken( rValue, XML_SEPARATING ) )
966 : : {
967 : 0 : pBorders->SetValue( sal_False );
968 : 0 : bOk = sal_True;
969 : : }
970 : : else
971 : 0 : bOk = sal_False;
972 : : }
973 : 0 : break;
974 : :
975 : : default:
976 : : OSL_FAIL("Item not implemented!");
977 : 0 : break;
978 : : }
979 : :
980 : 150 : return bOk;
981 : : }
982 : :
983 : :
984 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|