LCOV - code coverage report
Current view: top level - libreoffice/sw/source/filter/xml - xmlimpit.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 158 417 37.9 %
Date: 2012-12-27 Functions: 5 9 55.6 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10