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

Generated by: LCOV version 1.10