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

Generated by: LCOV version 1.10