|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_xmloff.hxx" | 
|  |  | 
|  | #include <fonthdl.hxx> | 
|  | #include <xmloff/xmltoken.hxx> | 
|  | #include <xmloff/xmluconv.hxx> | 
|  | #include <rtl/ustrbuf.hxx> | 
|  | #include <com/sun/star/uno/Any.hxx> | 
|  | #include <tools/fontenum.hxx> | 
|  |  | 
|  | #include <tools/string.hxx> | 
|  |  | 
|  | using ::rtl::OUString; | 
|  | using ::rtl::OUStringBuffer; | 
|  |  | 
|  | using namespace ::com::sun::star; | 
|  | using namespace ::xmloff::token; | 
|  |  | 
|  | const SvXMLEnumMapEntry* lcl_getFontFamilyGenericMapping() | 
|  | { | 
|  | static SvXMLEnumMapEntry __READONLY_DATA aFontFamilyGenericMapping[] = | 
|  | { | 
|  | { XML_DECORATIVE,	    FAMILY_DECORATIVE }, | 
|  |  | 
|  | { XML_MODERN,		    FAMILY_MODERN	}, | 
|  | { XML_ROMAN,	    	FAMILY_ROMAN	}, | 
|  | { XML_SCRIPT,		    FAMILY_SCRIPT	}, | 
|  | { XML_SWISS,	    	FAMILY_SWISS	}, | 
|  | { XML_SYSTEM,   		FAMILY_SYSTEM	}, | 
|  | { XML_TOKEN_INVALID,    0 				} | 
|  | }; | 
|  | return aFontFamilyGenericMapping; | 
|  | } | 
|  |  | 
|  | static SvXMLEnumMapEntry __READONLY_DATA aFontPitchMapping[] = | 
|  | { | 
|  | { XML_FIXED,		    PITCH_FIXED		}, | 
|  | { XML_VARIABLE,	        PITCH_VARIABLE	}, | 
|  | { XML_TOKEN_INVALID,    0 				} | 
|  | }; | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // | 
|  | // class XMLFontFamilyNamePropHdl | 
|  | // | 
|  |  | 
|  | XMLFontFamilyNamePropHdl::~XMLFontFamilyNamePropHdl() | 
|  | { | 
|  | // Nothing to do | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontFamilyNamePropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_Bool bRet = sal_False; | 
|  | String sValue; | 
|  | sal_Int32 nPos = 0; | 
|  |  | 
|  | do | 
|  | { | 
|  | sal_Int32 nFirst = nPos; | 
|  | nPos = SvXMLUnitConverter::indexOfComma( rStrImpValue, nPos ); | 
|  | sal_Int32 nLast = (-1 == nPos ? rStrImpValue.getLength() : nPos); | 
|  | if( nLast > 0 ) | 
|  | nLast--; | 
|  |  | 
|  | // skip trailing blanks | 
|  | while( sal_Unicode(' ') == rStrImpValue[nLast] && nLast > nFirst ) | 
|  | nLast--; | 
|  |  | 
|  | // skip leading blanks | 
|  | while( sal_Unicode(' ') == rStrImpValue[nFirst] && nFirst <= nLast ) | 
|  | nFirst++; | 
|  |  | 
|  | // remove quotes | 
|  | sal_Unicode c = rStrImpValue[nFirst]; | 
|  | if( nFirst < nLast && (sal_Unicode('\'') == c || sal_Unicode('\"') == c) && rStrImpValue[nLast] == c ) | 
|  | { | 
|  | nFirst++; | 
|  | nLast--; | 
|  | } | 
|  |  | 
|  | if( nFirst <= nLast ) | 
|  | { | 
|  | if( sValue.Len() != 0 ) | 
|  | sValue += sal_Unicode(';'); | 
|  |  | 
|  | OUString sTemp = rStrImpValue.copy( nFirst, nLast-nFirst+1 ); | 
|  | sValue += sTemp.getStr(); | 
|  | } | 
|  |  | 
|  | if( -1 != nPos ) | 
|  | nPos++; | 
|  | } | 
|  | while( -1 != nPos ); | 
|  |  | 
|  | if( sValue.Len() ) | 
|  | { | 
|  | rValue <<= OUString(sValue.GetBuffer()); | 
|  | bRet = sal_True; | 
|  | } | 
|  |  | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontFamilyNamePropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_Bool bRet = sal_False; | 
|  | OUString aStrFamilyName; | 
|  |  | 
|  | if( rValue >>= aStrFamilyName ) | 
|  | { | 
|  | OUStringBuffer sValue( aStrFamilyName.getLength() + 2L ); | 
|  | sal_Int32 nPos = 0; | 
|  | do | 
|  | { | 
|  | sal_Int32 nFirst = nPos; | 
|  | nPos = aStrFamilyName.indexOf( sal_Unicode(';'), nPos ); | 
|  | sal_Int32 nLast = (-1 == nPos ? aStrFamilyName.getLength() : nPos); | 
|  |  | 
|  | // Set position to the character behind the ';', so we won't | 
|  | // forget this. | 
|  | if( -1L != nPos ) | 
|  | nPos++; | 
|  |  | 
|  | // If the property value was empty, we stop now. | 
|  | // If there is a ';' at the first position, the empty name | 
|  | // at the start will be removed. | 
|  | if( 0L == nLast ) | 
|  | continue; | 
|  |  | 
|  | // nFirst and nLast now denote the first and last character of | 
|  | // one font name. | 
|  | nLast--; | 
|  |  | 
|  | // skip trailing blanks | 
|  | while( sal_Unicode(' ') == aStrFamilyName[nLast] && nLast > nFirst ) | 
|  | nLast--; | 
|  |  | 
|  | // skip leading blanks | 
|  | while( sal_Unicode(' ') == aStrFamilyName[nFirst] && nFirst <= nLast ) | 
|  | nFirst++; | 
|  |  | 
|  | if( nFirst <= nLast ) | 
|  | { | 
|  | if( sValue.getLength() != 0L ) | 
|  | { | 
|  | sValue.append( sal_Unicode( ',' ) ); | 
|  | sValue.append( sal_Unicode( ' ' )); | 
|  | } | 
|  | sal_Int32 nLen = nLast-nFirst+1; | 
|  | OUString sFamily( aStrFamilyName.copy( nFirst, nLen ) ); | 
|  | sal_Bool bQuote = sal_False; | 
|  | for( sal_Int32 i=0; i < nLen; i++ ) | 
|  | { | 
|  | sal_Unicode c = sFamily[i]; | 
|  | if( sal_Unicode(' ') == c || sal_Unicode(',') == c ) | 
|  | { | 
|  | bQuote = sal_True; | 
|  | break; | 
|  | } | 
|  | } | 
|  | if( bQuote ) | 
|  | sValue.append( sal_Unicode('\'') ); | 
|  | sValue.append( sFamily ); | 
|  | if( bQuote ) | 
|  | sValue.append( sal_Unicode('\'') ); | 
|  | } | 
|  | } | 
|  | while( -1L != nPos ); | 
|  |  | 
|  | rStrExpValue = sValue.makeStringAndClear(); | 
|  |  | 
|  | bRet = sal_True; | 
|  | } | 
|  |  | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // | 
|  | // class XMLFontFamilyPropHdl | 
|  | // | 
|  |  | 
|  | XMLFontFamilyPropHdl::~XMLFontFamilyPropHdl() | 
|  | { | 
|  | // Nothing to do | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontFamilyPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_uInt16 eNewFamily; | 
|  | sal_Bool bRet = SvXMLUnitConverter::convertEnum( eNewFamily, rStrImpValue, lcl_getFontFamilyGenericMapping() ); | 
|  | if( bRet ) | 
|  | rValue <<= (sal_Int16)eNewFamily; | 
|  |  | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontFamilyPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_Bool bRet = sal_False; | 
|  | OUStringBuffer aOut; | 
|  |  | 
|  | sal_Int16 nFamily = sal_Int16(); | 
|  | if( rValue >>= nFamily ) | 
|  | { | 
|  | FontFamily eFamily = (FontFamily)nFamily; | 
|  | if( eFamily != FAMILY_DONTKNOW ) | 
|  | bRet = SvXMLUnitConverter::convertEnum( aOut, eFamily, lcl_getFontFamilyGenericMapping() ); | 
|  | } | 
|  |  | 
|  | rStrExpValue = aOut.makeStringAndClear(); | 
|  |  | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // | 
|  | // class XMLFontEncodingPropHdl | 
|  | // | 
|  |  | 
|  | XMLFontEncodingPropHdl::~XMLFontEncodingPropHdl() | 
|  | { | 
|  | // Nothing to do | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontEncodingPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_Bool bRet = sal_True; | 
|  |  | 
|  | if( IsXMLToken( rStrImpValue, XML_X_SYMBOL ) ) | 
|  | rValue <<= (sal_Int16) RTL_TEXTENCODING_SYMBOL; | 
|  |  | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontEncodingPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_Bool bRet = sal_False; | 
|  | OUStringBuffer aOut; | 
|  | sal_Int16 nSet = sal_Int16(); | 
|  |  | 
|  | if( rValue >>= nSet ) | 
|  | { | 
|  | if( (rtl_TextEncoding)nSet == RTL_TEXTENCODING_SYMBOL ) | 
|  | { | 
|  | aOut.append( GetXMLToken(XML_X_SYMBOL) ); | 
|  | rStrExpValue = aOut.makeStringAndClear(); | 
|  | bRet = sal_True; | 
|  | } | 
|  | } | 
|  |  | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // | 
|  | // class XMLFontPitchPropHdl | 
|  | // | 
|  |  | 
|  | XMLFontPitchPropHdl::~XMLFontPitchPropHdl() | 
|  | { | 
|  | // Nothing to do | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontPitchPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_uInt16 eNewPitch; | 
|  | sal_Bool bRet = SvXMLUnitConverter::convertEnum( eNewPitch, rStrImpValue, aFontPitchMapping ); | 
|  | if( bRet ) | 
|  | rValue <<= (sal_Int16)eNewPitch; | 
|  |  | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | sal_Bool XMLFontPitchPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const | 
|  | { | 
|  | sal_Bool bRet = sal_False; | 
|  | sal_Int16 nPitch = sal_Int16(); | 
|  | OUStringBuffer aOut; | 
|  |  | 
|  | FontPitch ePitch = PITCH_DONTKNOW; | 
|  | if( rValue >>= nPitch ) | 
|  | ePitch =  (FontPitch)nPitch; | 
|  |  | 
|  | if( PITCH_DONTKNOW != ePitch ) | 
|  | { | 
|  | bRet = SvXMLUnitConverter::convertEnum( aOut, ePitch, aFontPitchMapping, XML_FIXED ); | 
|  | rStrExpValue = aOut.makeStringAndClear(); | 
|  | } | 
|  |  | 
|  | return bRet; | 
|  | } |