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 <tools/debug.hxx> 27 #include <backhdl.hxx> 28 #include <xmloff/xmltoken.hxx> 29 #include <xmloff/xmluconv.hxx> 30 #include <com/sun/star/uno/Any.hxx> 31 #include <rtl/ustrbuf.hxx> 32 33 using ::rtl::OUString; 34 using ::rtl::OUStringBuffer; 35 36 using namespace ::com::sun::star; 37 using namespace ::xmloff::token; 38 39 SvXMLEnumMapEntry pXML_BrushHorizontalPos[] = 40 { 41 { XML_LEFT, style::GraphicLocation_LEFT_MIDDLE }, 42 { XML_RIGHT, style::GraphicLocation_RIGHT_MIDDLE }, 43 { XML_TOKEN_INVALID, 0 } 44 }; 45 46 SvXMLEnumMapEntry pXML_BrushVerticalPos[] = 47 { 48 { XML_TOP, style::GraphicLocation_MIDDLE_TOP }, 49 { XML_BOTTOM, style::GraphicLocation_MIDDLE_BOTTOM }, 50 { XML_TOKEN_INVALID, 0 } 51 }; 52 53 /////////////////////////////////////////////////////////////////////////////// 54 // 55 // class XMLBackGraphicPositionPropHdl 56 // 57 58 XMLBackGraphicPositionPropHdl::~XMLBackGraphicPositionPropHdl() 59 { 60 // Nothing to do 61 } 62 63 sal_Bool XMLBackGraphicPositionPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const 64 { 65 sal_Bool bRet = sal_True; 66 style::GraphicLocation ePos = style::GraphicLocation_NONE, eTmp; 67 sal_uInt16 nTmp; 68 SvXMLTokenEnumerator aTokenEnum( rStrImpValue ); 69 OUString aToken; 70 sal_Bool bHori = sal_False, bVert = sal_False; 71 72 while( bRet && aTokenEnum.getNextToken( aToken ) ) 73 { 74 if( bHori && bVert ) 75 { 76 bRet = sal_False; 77 } 78 else if( -1 != aToken.indexOf( sal_Unicode('%') ) ) 79 { 80 sal_Int32 nPrc = 50; 81 if( SvXMLUnitConverter::convertPercent( nPrc, aToken ) ) 82 { 83 if( !bHori ) 84 { 85 ePos = nPrc < 25 ? style::GraphicLocation_LEFT_TOP : 86 (nPrc < 75 ? style::GraphicLocation_MIDDLE_MIDDLE : 87 style::GraphicLocation_RIGHT_BOTTOM); 88 bHori = sal_True; 89 } 90 else 91 { 92 eTmp = nPrc < 25 ? style::GraphicLocation_LEFT_TOP: 93 (nPrc < 75 ? style::GraphicLocation_LEFT_MIDDLE : 94 style::GraphicLocation_LEFT_BOTTOM); 95 MergeXMLVertPos( ePos, eTmp ); 96 bVert = sal_True; 97 } 98 } 99 else 100 { 101 // wrong percentage 102 bRet = sal_False; 103 } 104 } 105 else if( IsXMLToken( aToken, XML_CENTER ) ) 106 { 107 if( bHori ) 108 MergeXMLVertPos( ePos, style::GraphicLocation_MIDDLE_MIDDLE ); 109 else if ( bVert ) 110 MergeXMLHoriPos( ePos, style::GraphicLocation_MIDDLE_MIDDLE ); 111 else 112 ePos = style::GraphicLocation_MIDDLE_MIDDLE; 113 } 114 else if( SvXMLUnitConverter::convertEnum( nTmp, aToken, pXML_BrushHorizontalPos ) ) 115 { 116 if( bVert ) 117 MergeXMLHoriPos( ePos, (style::GraphicLocation)nTmp ); 118 else if( !bHori ) 119 ePos = (style::GraphicLocation)nTmp; 120 else 121 bRet = sal_False; 122 123 bHori = sal_True; 124 } 125 else if( SvXMLUnitConverter::convertEnum( nTmp, aToken, pXML_BrushVerticalPos ) ) 126 { 127 if( bHori ) 128 MergeXMLVertPos( ePos, (style::GraphicLocation)nTmp ); 129 else if( !bVert ) 130 ePos = (style::GraphicLocation)nTmp; 131 else 132 bRet = sal_False; 133 bVert = sal_True; 134 } 135 else 136 { 137 bRet = sal_False; 138 } 139 } 140 141 bRet &= style::GraphicLocation_NONE != ePos; 142 if( bRet ) 143 rValue <<= (style::GraphicLocation)(sal_uInt16)ePos; 144 145 return bRet; 146 } 147 148 sal_Bool XMLBackGraphicPositionPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const 149 { 150 sal_Bool bRet = sal_True; 151 OUStringBuffer aOut; 152 153 style::GraphicLocation eLocation; 154 if( !( rValue >>= eLocation ) ) 155 { 156 sal_Int32 nValue = 0; 157 if( rValue >>= nValue ) 158 eLocation = (style::GraphicLocation)nValue; 159 else 160 bRet = sal_False; 161 } 162 163 if( bRet ) 164 { 165 bRet = sal_False; 166 167 switch( eLocation ) 168 { 169 case style::GraphicLocation_LEFT_TOP: 170 case style::GraphicLocation_MIDDLE_TOP: 171 case style::GraphicLocation_RIGHT_TOP: 172 aOut.append( GetXMLToken(XML_TOP) ); 173 bRet = sal_True; 174 break; 175 case style::GraphicLocation_LEFT_MIDDLE: 176 case style::GraphicLocation_MIDDLE_MIDDLE: 177 case style::GraphicLocation_RIGHT_MIDDLE: 178 aOut.append( GetXMLToken(XML_CENTER) ); 179 bRet = sal_True; 180 break; 181 case style::GraphicLocation_LEFT_BOTTOM: 182 case style::GraphicLocation_MIDDLE_BOTTOM: 183 case style::GraphicLocation_RIGHT_BOTTOM: 184 aOut.append( GetXMLToken(XML_BOTTOM) ); 185 bRet = sal_True; 186 break; 187 default: 188 break; 189 } 190 191 if( bRet ) 192 { 193 aOut.append( sal_Unicode( ' ' ) ); 194 195 switch( eLocation ) 196 { 197 case style::GraphicLocation_LEFT_TOP: 198 case style::GraphicLocation_LEFT_BOTTOM: 199 case style::GraphicLocation_LEFT_MIDDLE: 200 aOut.append( GetXMLToken(XML_LEFT) ); 201 break; 202 case style::GraphicLocation_MIDDLE_TOP: 203 case style::GraphicLocation_MIDDLE_MIDDLE: 204 case style::GraphicLocation_MIDDLE_BOTTOM: 205 aOut.append( GetXMLToken(XML_CENTER) ); 206 break; 207 case style::GraphicLocation_RIGHT_MIDDLE: 208 case style::GraphicLocation_RIGHT_TOP: 209 case style::GraphicLocation_RIGHT_BOTTOM: 210 aOut.append( GetXMLToken(XML_RIGHT) ); 211 break; 212 default: 213 break; 214 } 215 } 216 } 217 218 rStrExpValue = aOut.makeStringAndClear(); 219 220 return bRet; 221 } 222 223 void XMLBackGraphicPositionPropHdl::MergeXMLVertPos( style::GraphicLocation& ePos, style::GraphicLocation eVert ) const 224 { 225 switch( ePos ) 226 { 227 case style::GraphicLocation_LEFT_TOP: 228 case style::GraphicLocation_LEFT_MIDDLE: 229 case style::GraphicLocation_LEFT_BOTTOM: 230 ePos = style::GraphicLocation_MIDDLE_TOP==eVert ? 231 style::GraphicLocation_LEFT_TOP : 232 (style::GraphicLocation_MIDDLE_MIDDLE==eVert ? 233 style::GraphicLocation_LEFT_MIDDLE : 234 style::GraphicLocation_LEFT_BOTTOM); 235 ePos = eVert; 236 break; 237 238 case style::GraphicLocation_MIDDLE_TOP: 239 case style::GraphicLocation_MIDDLE_MIDDLE: 240 case style::GraphicLocation_MIDDLE_BOTTOM: 241 ePos = eVert; 242 break; 243 244 case style::GraphicLocation_RIGHT_TOP: 245 case style::GraphicLocation_RIGHT_MIDDLE: 246 case style::GraphicLocation_RIGHT_BOTTOM: 247 ePos = style::GraphicLocation_MIDDLE_TOP==eVert ? 248 style::GraphicLocation_RIGHT_TOP : 249 (style::GraphicLocation_MIDDLE_MIDDLE==eVert ? 250 style::GraphicLocation_RIGHT_MIDDLE : 251 style::GraphicLocation_RIGHT_BOTTOM); 252 break; 253 default: 254 break; 255 } 256 } 257 258 void XMLBackGraphicPositionPropHdl::MergeXMLHoriPos( style::GraphicLocation& ePos, style::GraphicLocation eHori ) const 259 { 260 DBG_ASSERT( style::GraphicLocation_LEFT_MIDDLE==eHori || style::GraphicLocation_MIDDLE_MIDDLE==eHori || style::GraphicLocation_RIGHT_MIDDLE==eHori, 261 "lcl_frmitems_MergeXMLHoriPos: vertical pos must be middle" ); 262 263 switch( ePos ) 264 { 265 case style::GraphicLocation_LEFT_TOP: 266 case style::GraphicLocation_MIDDLE_TOP: 267 case style::GraphicLocation_RIGHT_TOP: 268 ePos = style::GraphicLocation_LEFT_MIDDLE==eHori ? 269 style::GraphicLocation_LEFT_TOP : 270 (style::GraphicLocation_MIDDLE_MIDDLE==eHori ? 271 style::GraphicLocation_MIDDLE_TOP : 272 style::GraphicLocation_RIGHT_TOP); 273 break; 274 275 case style::GraphicLocation_LEFT_MIDDLE: 276 case style::GraphicLocation_MIDDLE_MIDDLE: 277 case style::GraphicLocation_RIGHT_MIDDLE: 278 ePos = eHori; 279 break; 280 281 case style::GraphicLocation_LEFT_BOTTOM: 282 case style::GraphicLocation_MIDDLE_BOTTOM: 283 case style::GraphicLocation_RIGHT_BOTTOM: 284 ePos = style::GraphicLocation_LEFT_MIDDLE==eHori ? 285 style::GraphicLocation_LEFT_BOTTOM : 286 (style::GraphicLocation_MIDDLE_MIDDLE==eHori ? 287 style::GraphicLocation_MIDDLE_BOTTOM : 288 style::GraphicLocation_RIGHT_BOTTOM); 289 break; 290 default: 291 break; 292 } 293 } 294 295