1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 #include "XMLClipPropertyHandler.hxx" 27 #include <com/sun/star/uno/Any.hxx> 28 #include <rtl/ustrbuf.hxx> 29 #include <com/sun/star/text/GraphicCrop.hpp> 30 #include <xmloff/xmluconv.hxx> 31 #include <xmloff/xmltoken.hxx> 32 33 using ::rtl::OUString; 34 using ::rtl::OUStringBuffer; 35 36 using namespace ::com::sun::star; 37 using namespace ::com::sun::star::uno; 38 using namespace ::com::sun::star::text; 39 using namespace ::xmloff::token; 40 41 /////////////////////////////////////////////////////////////////////////////// 42 // 43 // class XMLMeasurePropHdl 44 // 45 46 XMLClipPropertyHandler::XMLClipPropertyHandler( sal_Bool bODF11 ) : 47 m_bODF11( bODF11 ) 48 { 49 } 50 51 XMLClipPropertyHandler::~XMLClipPropertyHandler() 52 { 53 // nothing to do 54 } 55 56 bool XMLClipPropertyHandler::equals( 57 const Any& r1, 58 const Any& r2 ) const 59 { 60 GraphicCrop aCrop1, aCrop2; 61 r1 >>= aCrop1; 62 r2 >>= aCrop2; 63 64 return aCrop1.Top == aCrop2.Top && 65 aCrop1.Bottom == aCrop2.Bottom && 66 aCrop1.Left == aCrop2.Left && 67 aCrop1.Right == aCrop2.Right; 68 } 69 70 sal_Bool XMLClipPropertyHandler::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const 71 { 72 sal_Bool bRet = sal_False; 73 sal_Int32 nLen = rStrImpValue.getLength(); 74 if( nLen > 6 && 75 0 == rStrImpValue.compareTo( GetXMLToken(XML_RECT), 4 ) && 76 rStrImpValue[4] == '(' && 77 rStrImpValue[nLen-1] == ')' ) 78 { 79 GraphicCrop aCrop; 80 OUString sTmp( rStrImpValue.copy( 5, nLen-6 ) ); 81 82 sal_Bool bHasComma = sTmp.indexOf( ',' ) != -1; 83 SvXMLTokenEnumerator aTokenEnum( sTmp, bHasComma ? ',' : ' ' ); 84 85 sal_uInt16 nPos = 0; 86 OUString aToken; 87 while( aTokenEnum.getNextToken( aToken ) ) 88 { 89 sal_Int32 nVal = 0; 90 if( !IsXMLToken(aToken, XML_AUTO) && 91 !rUnitConverter.convertMeasure( nVal, aToken ) ) 92 break; 93 94 switch( nPos ) 95 { 96 case 0: aCrop.Top = nVal; break; 97 case 1: aCrop.Right = nVal; break; 98 case 2: aCrop.Bottom = nVal; break; 99 case 3: aCrop.Left = nVal; break; 100 } 101 nPos++; 102 } 103 104 bRet = (4 == nPos ); 105 if( bRet ) 106 rValue <<= aCrop; 107 } 108 109 return bRet; 110 } 111 112 sal_Bool XMLClipPropertyHandler::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const 113 { 114 sal_Bool bRet = sal_False; 115 OUStringBuffer aOut(30); 116 GraphicCrop aCrop; 117 118 if( rValue >>= aCrop ) 119 { 120 aOut.append( GetXMLToken(XML_RECT) ); 121 aOut.append( (sal_Unicode)'(' ); 122 rUnitConverter.convertMeasure( aOut, aCrop.Top ); 123 if( !m_bODF11 ) 124 aOut.append( (sal_Unicode)',' ); 125 aOut.append( (sal_Unicode)' ' ); 126 rUnitConverter.convertMeasure( aOut, aCrop.Right ); 127 if( !m_bODF11 ) 128 aOut.append( (sal_Unicode)',' ); 129 aOut.append( (sal_Unicode)' ' ); 130 rUnitConverter.convertMeasure( aOut, aCrop.Bottom ); 131 if( !m_bODF11 ) 132 aOut.append( (sal_Unicode)',' ); 133 aOut.append( (sal_Unicode)' ' ); 134 rUnitConverter.convertMeasure( aOut, aCrop.Left ); 135 aOut.append( (sal_Unicode)')' ); 136 rStrExpValue = aOut.makeStringAndClear(); 137 138 bRet = sal_True; 139 } 140 141 return bRet; 142 } 143