| /************************************************************** | 
 |  *  | 
 |  * 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; | 
 | } |