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 27 #include <fonthdl.hxx> 28 #include <xmloff/xmltoken.hxx> 29 #include <xmloff/xmluconv.hxx> 30 #include <rtl/ustrbuf.hxx> 31 #include <com/sun/star/uno/Any.hxx> 32 #include <tools/fontenum.hxx> 33 34 #include <tools/string.hxx> 35 36 using ::rtl::OUString; 37 using ::rtl::OUStringBuffer; 38 39 using namespace ::com::sun::star; 40 using namespace ::xmloff::token; 41 42 const SvXMLEnumMapEntry* lcl_getFontFamilyGenericMapping() 43 { 44 static SvXMLEnumMapEntry __READONLY_DATA aFontFamilyGenericMapping[] = 45 { 46 { XML_DECORATIVE, FAMILY_DECORATIVE }, 47 48 { XML_MODERN, FAMILY_MODERN }, 49 { XML_ROMAN, FAMILY_ROMAN }, 50 { XML_SCRIPT, FAMILY_SCRIPT }, 51 { XML_SWISS, FAMILY_SWISS }, 52 { XML_SYSTEM, FAMILY_SYSTEM }, 53 { XML_TOKEN_INVALID, 0 } 54 }; 55 return aFontFamilyGenericMapping; 56 } 57 58 static SvXMLEnumMapEntry __READONLY_DATA aFontPitchMapping[] = 59 { 60 { XML_FIXED, PITCH_FIXED }, 61 { XML_VARIABLE, PITCH_VARIABLE }, 62 { XML_TOKEN_INVALID, 0 } 63 }; 64 /////////////////////////////////////////////////////////////////////////////// 65 // 66 // class XMLFontFamilyNamePropHdl 67 // 68 69 XMLFontFamilyNamePropHdl::~XMLFontFamilyNamePropHdl() 70 { 71 // Nothing to do 72 } 73 74 sal_Bool XMLFontFamilyNamePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const 75 { 76 sal_Bool bRet = sal_False; 77 String sValue; 78 sal_Int32 nPos = 0; 79 80 do 81 { 82 sal_Int32 nFirst = nPos; 83 nPos = SvXMLUnitConverter::indexOfComma( rStrImpValue, nPos ); 84 sal_Int32 nLast = (-1 == nPos ? rStrImpValue.getLength() : nPos); 85 if( nLast > 0 ) 86 nLast--; 87 88 // skip trailing blanks 89 while( sal_Unicode(' ') == rStrImpValue[nLast] && nLast > nFirst ) 90 nLast--; 91 92 // skip leading blanks 93 while( sal_Unicode(' ') == rStrImpValue[nFirst] && nFirst <= nLast ) 94 nFirst++; 95 96 // remove quotes 97 sal_Unicode c = rStrImpValue[nFirst]; 98 if( nFirst < nLast && (sal_Unicode('\'') == c || sal_Unicode('\"') == c) && rStrImpValue[nLast] == c ) 99 { 100 nFirst++; 101 nLast--; 102 } 103 104 if( nFirst <= nLast ) 105 { 106 if( sValue.Len() != 0 ) 107 sValue += sal_Unicode(';'); 108 109 OUString sTemp = rStrImpValue.copy( nFirst, nLast-nFirst+1 ); 110 sValue += sTemp.getStr(); 111 } 112 113 if( -1 != nPos ) 114 nPos++; 115 } 116 while( -1 != nPos ); 117 118 if( sValue.Len() ) 119 { 120 rValue <<= OUString(sValue.GetBuffer()); 121 bRet = sal_True; 122 } 123 124 return bRet; 125 } 126 127 sal_Bool XMLFontFamilyNamePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const 128 { 129 sal_Bool bRet = sal_False; 130 OUString aStrFamilyName; 131 132 if( rValue >>= aStrFamilyName ) 133 { 134 OUStringBuffer sValue( aStrFamilyName.getLength() + 2L ); 135 sal_Int32 nPos = 0; 136 do 137 { 138 sal_Int32 nFirst = nPos; 139 nPos = aStrFamilyName.indexOf( sal_Unicode(';'), nPos ); 140 sal_Int32 nLast = (-1 == nPos ? aStrFamilyName.getLength() : nPos); 141 142 // Set position to the character behind the ';', so we won't 143 // forget this. 144 if( -1L != nPos ) 145 nPos++; 146 147 // If the property value was empty, we stop now. 148 // If there is a ';' at the first position, the empty name 149 // at the start will be removed. 150 if( 0L == nLast ) 151 continue; 152 153 // nFirst and nLast now denote the first and last character of 154 // one font name. 155 nLast--; 156 157 // skip trailing blanks 158 while( sal_Unicode(' ') == aStrFamilyName[nLast] && nLast > nFirst ) 159 nLast--; 160 161 // skip leading blanks 162 while( sal_Unicode(' ') == aStrFamilyName[nFirst] && nFirst <= nLast ) 163 nFirst++; 164 165 if( nFirst <= nLast ) 166 { 167 if( sValue.getLength() != 0L ) 168 { 169 sValue.append( sal_Unicode( ',' ) ); 170 sValue.append( sal_Unicode( ' ' )); 171 } 172 sal_Int32 nLen = nLast-nFirst+1; 173 OUString sFamily( aStrFamilyName.copy( nFirst, nLen ) ); 174 sal_Bool bQuote = sal_False; 175 for( sal_Int32 i=0; i < nLen; i++ ) 176 { 177 sal_Unicode c = sFamily[i]; 178 if( sal_Unicode(' ') == c || sal_Unicode(',') == c ) 179 { 180 bQuote = sal_True; 181 break; 182 } 183 } 184 if( bQuote ) 185 sValue.append( sal_Unicode('\'') ); 186 sValue.append( sFamily ); 187 if( bQuote ) 188 sValue.append( sal_Unicode('\'') ); 189 } 190 } 191 while( -1L != nPos ); 192 193 rStrExpValue = sValue.makeStringAndClear(); 194 195 bRet = sal_True; 196 } 197 198 return bRet; 199 } 200 201 /////////////////////////////////////////////////////////////////////////////// 202 // 203 // class XMLFontFamilyPropHdl 204 // 205 206 XMLFontFamilyPropHdl::~XMLFontFamilyPropHdl() 207 { 208 // Nothing to do 209 } 210 211 sal_Bool XMLFontFamilyPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const 212 { 213 sal_uInt16 eNewFamily; 214 sal_Bool bRet = SvXMLUnitConverter::convertEnum( eNewFamily, rStrImpValue, lcl_getFontFamilyGenericMapping() ); 215 if( bRet ) 216 rValue <<= (sal_Int16)eNewFamily; 217 218 return bRet; 219 } 220 221 sal_Bool XMLFontFamilyPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const 222 { 223 sal_Bool bRet = sal_False; 224 OUStringBuffer aOut; 225 226 sal_Int16 nFamily = sal_Int16(); 227 if( rValue >>= nFamily ) 228 { 229 FontFamily eFamily = (FontFamily)nFamily; 230 if( eFamily != FAMILY_DONTKNOW ) 231 bRet = SvXMLUnitConverter::convertEnum( aOut, eFamily, lcl_getFontFamilyGenericMapping() ); 232 } 233 234 rStrExpValue = aOut.makeStringAndClear(); 235 236 return bRet; 237 } 238 239 /////////////////////////////////////////////////////////////////////////////// 240 // 241 // class XMLFontEncodingPropHdl 242 // 243 244 XMLFontEncodingPropHdl::~XMLFontEncodingPropHdl() 245 { 246 // Nothing to do 247 } 248 249 sal_Bool XMLFontEncodingPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const 250 { 251 sal_Bool bRet = sal_True; 252 253 if( IsXMLToken( rStrImpValue, XML_X_SYMBOL ) ) 254 rValue <<= (sal_Int16) RTL_TEXTENCODING_SYMBOL; 255 256 return bRet; 257 } 258 259 sal_Bool XMLFontEncodingPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const 260 { 261 sal_Bool bRet = sal_False; 262 OUStringBuffer aOut; 263 sal_Int16 nSet = sal_Int16(); 264 265 if( rValue >>= nSet ) 266 { 267 if( (rtl_TextEncoding)nSet == RTL_TEXTENCODING_SYMBOL ) 268 { 269 aOut.append( GetXMLToken(XML_X_SYMBOL) ); 270 rStrExpValue = aOut.makeStringAndClear(); 271 bRet = sal_True; 272 } 273 } 274 275 return bRet; 276 } 277 278 /////////////////////////////////////////////////////////////////////////////// 279 // 280 // class XMLFontPitchPropHdl 281 // 282 283 XMLFontPitchPropHdl::~XMLFontPitchPropHdl() 284 { 285 // Nothing to do 286 } 287 288 sal_Bool XMLFontPitchPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const 289 { 290 sal_uInt16 eNewPitch; 291 sal_Bool bRet = SvXMLUnitConverter::convertEnum( eNewPitch, rStrImpValue, aFontPitchMapping ); 292 if( bRet ) 293 rValue <<= (sal_Int16)eNewPitch; 294 295 return bRet; 296 } 297 298 sal_Bool XMLFontPitchPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const 299 { 300 sal_Bool bRet = sal_False; 301 sal_Int16 nPitch = sal_Int16(); 302 OUStringBuffer aOut; 303 304 FontPitch ePitch = PITCH_DONTKNOW; 305 if( rValue >>= nPitch ) 306 ePitch = (FontPitch)nPitch; 307 308 if( PITCH_DONTKNOW != ePitch ) 309 { 310 bRet = SvXMLUnitConverter::convertEnum( aOut, ePitch, aFontPitchMapping, XML_FIXED ); 311 rStrExpValue = aOut.makeStringAndClear(); 312 } 313 314 return bRet; 315 } 316