| /************************************************************** | 
 |  *  | 
 |  * 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 <com/sun/star/drawing/DashStyle.hpp> | 
 | #include <com/sun/star/drawing/LineDash.hpp> | 
 | #include "xmloff/DashStyle.hxx" | 
 | #include <xmloff/attrlist.hxx> | 
 | #include <xmloff/nmspmap.hxx> | 
 | #include <xmloff/xmluconv.hxx> | 
 | #include "xmloff/xmlnmspe.hxx" | 
 | #include <xmloff/xmltoken.hxx> | 
 | #include <xmloff/xmlexp.hxx> | 
 | #include <xmloff/xmlimp.hxx> | 
 | #include <rtl/ustrbuf.hxx> | 
 | #include <rtl/ustring.hxx> | 
 | #include <tools/debug.hxx> | 
 | #include <xmloff/xmltkmap.hxx> | 
 |  | 
 | using namespace ::com::sun::star; | 
 | using ::rtl::OUString; | 
 | using ::rtl::OUStringBuffer; | 
 |  | 
 | using namespace ::xmloff::token; | 
 |  | 
 | enum SvXMLTokenMapAttrs | 
 | { | 
 | 	XML_TOK_DASH_NAME, | 
 | 	XML_TOK_DASH_DISPLAY_NAME, | 
 | 	XML_TOK_DASH_STYLE, | 
 | 	XML_TOK_DASH_DOTS1, | 
 | 	XML_TOK_DASH_DOTS1LEN, | 
 | 	XML_TOK_DASH_DOTS2, | 
 | 	XML_TOK_DASH_DOTS2LEN, | 
 | 	XML_TOK_DASH_DISTANCE, | 
 | 	XML_TOK_DASH_END=XML_TOK_UNKNOWN | 
 | }; | 
 |  | 
 | static __FAR_DATA SvXMLTokenMapEntry aDashStyleAttrTokenMap[] = | 
 | { | 
 | 	{ XML_NAMESPACE_DRAW, XML_NAME,			    XML_TOK_DASH_NAME }, | 
 | 	{ XML_NAMESPACE_DRAW, XML_DISPLAY_NAME,	    XML_TOK_DASH_DISPLAY_NAME }, | 
 | 	{ XML_NAMESPACE_DRAW, XML_STYLE,			XML_TOK_DASH_STYLE }, | 
 | 	{ XML_NAMESPACE_DRAW, XML_DOTS1,			XML_TOK_DASH_DOTS1 }, | 
 | 	{ XML_NAMESPACE_DRAW, XML_DOTS1_LENGTH,	    XML_TOK_DASH_DOTS1LEN }, | 
 | 	{ XML_NAMESPACE_DRAW, XML_DOTS2,			XML_TOK_DASH_DOTS2 }, | 
 | 	{ XML_NAMESPACE_DRAW, XML_DOTS2_LENGTH,	    XML_TOK_DASH_DOTS2LEN }, | 
 | 	{ XML_NAMESPACE_DRAW, XML_DISTANCE,		    XML_TOK_DASH_DISTANCE }, | 
 | 	XML_TOKEN_MAP_END  | 
 | }; | 
 |  | 
 | SvXMLEnumMapEntry __READONLY_DATA pXML_DashStyle_Enum[] = | 
 | { | 
 | 	{ XML_RECT,		    drawing::DashStyle_RECT }, | 
 | 	{ XML_ROUND,		drawing::DashStyle_ROUND }, | 
 | 	{ XML_RECT,		    drawing::DashStyle_RECTRELATIVE }, | 
 | 	{ XML_ROUND,		drawing::DashStyle_ROUNDRELATIVE }, | 
 | 	{ XML_TOKEN_INVALID, 0 } | 
 | }; | 
 |  | 
 | //------------------------------------------------------------- | 
 | // Import | 
 | //------------------------------------------------------------- | 
 |  | 
 | XMLDashStyleImport::XMLDashStyleImport( SvXMLImport& rImp ) | 
 |     : rImport(rImp) | 
 | { | 
 | } | 
 |  | 
 | XMLDashStyleImport::~XMLDashStyleImport() | 
 | { | 
 | } | 
 |  | 
 | sal_Bool XMLDashStyleImport::importXML(  | 
 |     const uno::Reference< xml::sax::XAttributeList >& xAttrList,  | 
 |     uno::Any& rValue,  | 
 |     OUString& rStrName ) | 
 | { | 
 | 	drawing::LineDash aLineDash; | 
 |     aLineDash.Style = drawing::DashStyle_RECT; | 
 |     aLineDash.Dots = 0; | 
 |     aLineDash.DotLen = 0; | 
 |     aLineDash.Dashes = 0; | 
 |     aLineDash.DashLen = 0; | 
 |     aLineDash.Distance = 20; | 
 | 	OUString aDisplayName; | 
 |  | 
 | 	sal_Bool bIsRel = sal_False; | 
 |  | 
 |     SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap(); | 
 |     SvXMLUnitConverter& rUnitConverter = rImport.GetMM100UnitConverter(); | 
 |  | 
 | 	SvXMLTokenMap aTokenMap( aDashStyleAttrTokenMap ); | 
 |  | 
 | 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; | 
 | 	for( sal_Int16 i=0; i < nAttrCount; i++ ) | 
 | 	{ | 
 | 		const OUString& rFullAttrName = xAttrList->getNameByIndex( i ); | 
 | 		OUString aStrAttrName; | 
 | 		sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName ); | 
 | 		const OUString& rStrValue = xAttrList->getValueByIndex( i ); | 
 |  | 
 | 		switch( aTokenMap.Get( nPrefix, aStrAttrName ) ) | 
 | 		{ | 
 | 		case XML_TOK_DASH_NAME: | 
 | 			{ | 
 | 				rStrName = rStrValue; | 
 | 			}			 | 
 | 			break; | 
 | 		case XML_TOK_DASH_DISPLAY_NAME: | 
 | 			{ | 
 | 				aDisplayName = rStrValue; | 
 | 			}			 | 
 | 			break; | 
 | 		case XML_TOK_DASH_STYLE: | 
 | 			{ | 
 | 				sal_uInt16 eValue; | 
 | 				if( rUnitConverter.convertEnum( eValue, rStrValue, pXML_DashStyle_Enum ) ) | 
 | 				{ | 
 | 					aLineDash.Style = (drawing::DashStyle) eValue; | 
 | 				} | 
 | 			} | 
 | 			break; | 
 | 		case XML_TOK_DASH_DOTS1: | 
 | 			aLineDash.Dots = (sal_Int16)rStrValue.toInt32(); | 
 | 			break; | 
 |  | 
 | 		case XML_TOK_DASH_DOTS1LEN: | 
 | 			{ | 
 | 				if( rStrValue.indexOf( sal_Unicode('%') ) != -1 ) // its a percentage | 
 | 				{ | 
 | 					bIsRel = sal_True; | 
 | 					rUnitConverter.convertPercent( aLineDash.DotLen, rStrValue ); | 
 | 				} | 
 | 				else | 
 | 				{ | 
 | 					rUnitConverter.convertMeasure( aLineDash.DotLen, rStrValue ); | 
 | 				} | 
 | 			} | 
 | 			break; | 
 |  | 
 | 		case XML_TOK_DASH_DOTS2: | 
 | 			aLineDash.Dashes = (sal_Int16)rStrValue.toInt32(); | 
 | 			break; | 
 |  | 
 | 		case XML_TOK_DASH_DOTS2LEN: | 
 | 			{ | 
 | 				if( rStrValue.indexOf( sal_Unicode('%') ) != -1 ) // its a percentage | 
 | 				{ | 
 | 					bIsRel = sal_True; | 
 | 					rUnitConverter.convertPercent( aLineDash.DashLen, rStrValue ); | 
 | 				} | 
 | 				else | 
 | 				{ | 
 | 					rUnitConverter.convertMeasure( aLineDash.DashLen, rStrValue ); | 
 | 				} | 
 | 			} | 
 | 			break; | 
 |  | 
 | 		case XML_TOK_DASH_DISTANCE: | 
 | 			{ | 
 | 				if( rStrValue.indexOf( sal_Unicode('%') ) != -1 ) // its a percentage | 
 | 				{ | 
 | 					bIsRel = sal_True; | 
 | 					rUnitConverter.convertPercent( aLineDash.Distance, rStrValue ); | 
 | 				} | 
 | 				else | 
 | 				{ | 
 | 					rUnitConverter.convertMeasure( aLineDash.Distance, rStrValue ); | 
 | 				} | 
 | 			} | 
 | 			break; | 
 | 		default: | 
 | 			DBG_WARNING( "Unknown token at import gradient style" ); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	if( bIsRel ) | 
 | 		aLineDash.Style = aLineDash.Style == drawing::DashStyle_RECT ? drawing::DashStyle_RECTRELATIVE : drawing::DashStyle_ROUNDRELATIVE; | 
 |  | 
 | 	rValue <<= aLineDash; | 
 |  | 
 | 	if( aDisplayName.getLength() ) | 
 | 	{ | 
 | 		rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_STROKE_DASH_ID,  | 
 | 									 rStrName, aDisplayName ); | 
 | 		rStrName = aDisplayName; | 
 | 	} | 
 |  | 
 | 	return sal_True; | 
 | } | 
 |  | 
 |  | 
 | //------------------------------------------------------------- | 
 | // Export | 
 | //------------------------------------------------------------- | 
 |  | 
 | #ifndef SVX_LIGHT | 
 |  | 
 | XMLDashStyleExport::XMLDashStyleExport( SvXMLExport& rExp ) | 
 |     : rExport(rExp) | 
 | { | 
 | } | 
 |  | 
 | XMLDashStyleExport::~XMLDashStyleExport() | 
 | { | 
 | } | 
 |  | 
 | sal_Bool XMLDashStyleExport::exportXML(  | 
 |     const OUString& rStrName,  | 
 |     const uno::Any& rValue ) | 
 | { | 
 | 	sal_Bool bRet = sal_False; | 
 |  | 
 |     SvXMLUnitConverter rUnitConverter = rExport.GetMM100UnitConverter(); | 
 |  | 
 | 	drawing::LineDash aLineDash; | 
 |  | 
 | 	if( rStrName.getLength() ) | 
 | 	{ | 
 | 		if( rValue >>= aLineDash ) | 
 | 		{ | 
 | 			sal_Bool bIsRel = aLineDash.Style == drawing::DashStyle_RECTRELATIVE || aLineDash.Style == drawing::DashStyle_ROUNDRELATIVE; | 
 | 			 | 
 | 			OUString aStrValue; | 
 | 			OUStringBuffer aOut; | 
 |  | 
 | 			// Name | 
 | 			sal_Bool bEncoded = sal_False; | 
 | 			rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME,  | 
 | 								  rExport.EncodeStyleName( rStrName, | 
 | 														   &bEncoded ) ); | 
 | 			if( bEncoded ) | 
 | 				rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME,  | 
 | 									  rStrName ); | 
 |  | 
 | 			// Style | 
 | 			rUnitConverter.convertEnum( aOut, aLineDash.Style, pXML_DashStyle_Enum ); | 
 | 			aStrValue = aOut.makeStringAndClear(); | 
 | 			rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE, aStrValue ); | 
 |  | 
 |  | 
 | 			// dots | 
 | 			if( aLineDash.Dots ) | 
 | 			{ | 
 | 				rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS1, OUString::valueOf( (sal_Int32)aLineDash.Dots ) ); | 
 |  | 
 | 				if( aLineDash.DotLen ) | 
 | 				{ | 
 | 					// dashes length | 
 | 					if( bIsRel ) | 
 | 					{ | 
 | 						rUnitConverter.convertPercent( aOut, aLineDash.DotLen ); | 
 | 					} | 
 | 					else | 
 | 					{ | 
 | 						rUnitConverter.convertMeasure( aOut, aLineDash.DotLen ); | 
 | 					} | 
 | 					aStrValue = aOut.makeStringAndClear(); | 
 | 					rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS1_LENGTH, aStrValue ); | 
 | 				} | 
 | 			} | 
 |  | 
 | 			// dashes | 
 | 			if( aLineDash.Dashes ) | 
 | 			{ | 
 | 				rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS2, OUString::valueOf( (sal_Int32)aLineDash.Dashes ) ); | 
 |  | 
 | 				if( aLineDash.DashLen ) | 
 | 				{ | 
 | 					// dashes length | 
 | 					if( bIsRel ) | 
 | 					{ | 
 | 						rUnitConverter.convertPercent( aOut, aLineDash.DashLen ); | 
 | 					} | 
 | 					else | 
 | 					{ | 
 | 						rUnitConverter.convertMeasure( aOut, aLineDash.DashLen ); | 
 | 					} | 
 | 					aStrValue = aOut.makeStringAndClear(); | 
 | 					rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS2_LENGTH, aStrValue ); | 
 | 				} | 
 | 			} | 
 | 			 | 
 | 			// distance | 
 | 			if( bIsRel ) | 
 | 			{ | 
 | 				rUnitConverter.convertPercent( aOut, aLineDash.Distance ); | 
 | 			} | 
 | 			else | 
 | 			{ | 
 | 				rUnitConverter.convertMeasure( aOut, aLineDash.Distance ); | 
 | 			} | 
 | 			aStrValue = aOut.makeStringAndClear(); | 
 | 			rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISTANCE, aStrValue ); | 
 |  | 
 |  | 
 | 			// do Write | 
 |             SvXMLElementExport rElem( rExport,  | 
 |                                       XML_NAMESPACE_DRAW, XML_STROKE_DASH, | 
 |                                       sal_True, sal_False ); | 
 | 		} | 
 | 	} | 
 | 	return bRet; | 
 | } | 
 |  | 
 | #endif // #ifndef SVX_LIGHT |