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 <svl/cntnrsrt.hxx>
28 #include <tools/fontenum.hxx>
29 #include "xmloff/xmlnmspe.hxx"
30 #include <xmloff/xmltoken.hxx>
31 #include <xmloff/xmluconv.hxx>
32 #include "fonthdl.hxx"
33 #include <xmloff/xmlexp.hxx>
34 #include <xmloff/XMLFontAutoStylePool.hxx>
35 
36 
37 using ::rtl::OUString;
38 using ::rtl::OUStringBuffer;
39 
40 using namespace ::com::sun::star::uno;
41 using namespace ::xmloff::token;
42 
XMLFontAutoStylePoolNameCmp_Impl(const OUString & r1,const OUString & r2)43 int XMLFontAutoStylePoolNameCmp_Impl( const OUString& r1,
44 									  const OUString& r2 )
45 {
46 	return (int)r1.compareTo( r2 );
47 }
48 
49 DECLARE_CONTAINER_SORT_DEL( XMLFontAutoStylePoolNames_Impl,
50 							OUString )
51 IMPL_CONTAINER_SORT( XMLFontAutoStylePoolNames_Impl,
52 					 OUString,
53 				     XMLFontAutoStylePoolNameCmp_Impl )
54 
55 class XMLFontAutoStylePoolEntry_Impl
56 {
57 	OUString	sName;
58 	OUString	sFamilyName;
59 	OUString	sStyleName;
60 	sal_Int16	nFamily;
61 	sal_Int16	nPitch;
62 	rtl_TextEncoding eEnc;
63 
64 public:
65 
66 	inline XMLFontAutoStylePoolEntry_Impl(
67 			const ::rtl::OUString& rName,
68 			const ::rtl::OUString& rFamilyName,
69 			const ::rtl::OUString& rStyleName,
70 			sal_Int16 nFamily,
71 			sal_Int16 nPitch,
72 			rtl_TextEncoding eEnc );
73 
74 	inline XMLFontAutoStylePoolEntry_Impl(
75 			const ::rtl::OUString& rFamilyName,
76 			const ::rtl::OUString& rStyleName,
77 			sal_Int16 nFamily,
78 			sal_Int16 nPitch,
79 			rtl_TextEncoding eEnc );
80 
GetName() const81 	const OUString&	GetName() const { return sName; }
GetFamilyName() const82 	const OUString&	GetFamilyName() const { return sFamilyName; }
GetStyleName() const83 	const OUString&	GetStyleName() const { return sStyleName; }
GetFamily() const84 	sal_Int16 GetFamily() const {	return nFamily; }
GetPitch() const85 	sal_Int16 GetPitch() const { return nPitch; }
GetEncoding() const86 	rtl_TextEncoding GetEncoding() const { return eEnc; }
87 };
88 
89 
XMLFontAutoStylePoolEntry_Impl(const::rtl::OUString & rName,const::rtl::OUString & rFamilyName,const::rtl::OUString & rStyleName,sal_Int16 nFam,sal_Int16 nP,rtl_TextEncoding eE)90 inline XMLFontAutoStylePoolEntry_Impl::XMLFontAutoStylePoolEntry_Impl(
91 		const ::rtl::OUString& rName,
92 		const ::rtl::OUString& rFamilyName,
93 		const ::rtl::OUString& rStyleName,
94 		sal_Int16 nFam,
95 		sal_Int16 nP,
96 		rtl_TextEncoding eE ) :
97 	sName( rName ),
98 	sFamilyName( rFamilyName ),
99 	sStyleName( rStyleName ),
100 	nFamily( nFam ),
101 	nPitch( nP ),
102 	eEnc( eE )
103 {
104 }
105 
XMLFontAutoStylePoolEntry_Impl(const::rtl::OUString & rFamilyName,const::rtl::OUString & rStyleName,sal_Int16 nFam,sal_Int16 nP,rtl_TextEncoding eE)106 inline XMLFontAutoStylePoolEntry_Impl::XMLFontAutoStylePoolEntry_Impl(
107 		const ::rtl::OUString& rFamilyName,
108 		const ::rtl::OUString& rStyleName,
109 		sal_Int16 nFam,
110 		sal_Int16 nP,
111 		rtl_TextEncoding eE ) :
112 	sFamilyName( rFamilyName ),
113 	sStyleName( rStyleName ),
114 	nFamily( nFam ),
115 	nPitch( nP ),
116 	eEnc( eE )
117 {
118 }
XMLFontAutoStylePoolEntryCmp_Impl(const XMLFontAutoStylePoolEntry_Impl & r1,const XMLFontAutoStylePoolEntry_Impl & r2)119 int XMLFontAutoStylePoolEntryCmp_Impl(
120 		const XMLFontAutoStylePoolEntry_Impl& r1,
121 		const XMLFontAutoStylePoolEntry_Impl& r2 )
122 {
123 	sal_Int8 nEnc1(r1.GetEncoding() != RTL_TEXTENCODING_SYMBOL);
124 	sal_Int8 nEnc2(r2.GetEncoding() != RTL_TEXTENCODING_SYMBOL);
125 	if( nEnc1 != nEnc2 )
126 		return nEnc1 - nEnc2;
127 	else if( r1.GetPitch() != r2.GetPitch() )
128 		return (int)r1.GetPitch() - (int)r2.GetPitch();
129 	else if( r1.GetFamily() != r2.GetFamily() )
130 		return (int)r1.GetFamily() - (int)r2.GetFamily();
131 	else
132 	{
133 		sal_Int32 nCmp = r1.GetFamilyName().compareTo( r2.GetFamilyName() );
134 		if( 0 == nCmp )
135 			return (int)r1.GetStyleName().compareTo( r2.GetStyleName() );
136 		else
137 			return (int)nCmp;
138 	}
139 }
140 
141 typedef XMLFontAutoStylePoolEntry_Impl *XMLFontAutoStylePoolEntryPtr;
DECLARE_CONTAINER_SORT_DEL(XMLFontAutoStylePool_Impl,XMLFontAutoStylePoolEntry_Impl)142 DECLARE_CONTAINER_SORT_DEL( XMLFontAutoStylePool_Impl,
143 							XMLFontAutoStylePoolEntry_Impl )
144 IMPL_CONTAINER_SORT( XMLFontAutoStylePool_Impl,
145 					 XMLFontAutoStylePoolEntry_Impl,
146 					 XMLFontAutoStylePoolEntryCmp_Impl )
147 
148 XMLFontAutoStylePool::XMLFontAutoStylePool( SvXMLExport& rExp ) :
149 	rExport( rExp ),
150 	pPool( new XMLFontAutoStylePool_Impl( 5, 5 ) ),
151 	pNames( new XMLFontAutoStylePoolNames_Impl( 5, 5 ) )
152 {
153 }
154 
~XMLFontAutoStylePool()155 XMLFontAutoStylePool::~XMLFontAutoStylePool()
156 {
157 	delete pPool;
158 	delete pNames;
159 }
160 
Add(const OUString & rFamilyName,const OUString & rStyleName,sal_Int16 nFamily,sal_Int16 nPitch,rtl_TextEncoding eEnc)161 OUString XMLFontAutoStylePool::Add(
162 			const OUString& rFamilyName,
163 			const OUString& rStyleName,
164 			sal_Int16 nFamily,
165 			sal_Int16 nPitch,
166 			rtl_TextEncoding eEnc )
167 {
168 	OUString sPoolName;
169 	XMLFontAutoStylePoolEntry_Impl aTmp( rFamilyName, rStyleName, nFamily,
170 									 	 nPitch, eEnc );
171 	sal_uLong nPos;
172 	if( pPool->Seek_Entry( &aTmp, &nPos ) )
173 	{
174 		sPoolName = pPool->GetObject( nPos )->GetName();
175 	}
176 	else
177 	{
178 		OUString sName;
179 		sal_Int32 nLen = rFamilyName.indexOf( sal_Unicode(';'), 0 );
180 		if( -1 == nLen )
181 		{
182 			sName = rFamilyName;
183 		}
184 		else if( nLen > 0 )
185 		{
186 			sName = rFamilyName.copy( 0, nLen );
187 			sName.trim();
188 		}
189 
190 		if( !sName.getLength() )
191 			sName = OUString::valueOf( sal_Unicode( 'F' ) );
192 
193 		if( pNames->Seek_Entry( &sName, 0 ) )
194 		{
195 			sal_Int32 nCount = 1;
196 			OUString sPrefix( sName );
197 			sName += OUString::valueOf( nCount );
198 			while( pNames->Seek_Entry( &sName, 0 ) )
199 			{
200 				sName = sPrefix;
201 				sName += OUString::valueOf( ++nCount );
202 			}
203 		}
204 
205 		XMLFontAutoStylePoolEntry_Impl *pEntry =
206 			new XMLFontAutoStylePoolEntry_Impl( sName, rFamilyName, rStyleName,
207 												nFamily, nPitch, eEnc );
208 		pPool->Insert( pEntry );
209 		pNames->Insert( new OUString( sName ) );
210 	}
211 
212 	return sPoolName;
213 }
214 
Find(const OUString & rFamilyName,const OUString & rStyleName,sal_Int16 nFamily,sal_Int16 nPitch,rtl_TextEncoding eEnc) const215 ::rtl::OUString XMLFontAutoStylePool::Find(
216 			const OUString& rFamilyName,
217 			const OUString& rStyleName,
218 			sal_Int16 nFamily,
219 			sal_Int16 nPitch,
220 			rtl_TextEncoding eEnc ) const
221 {
222 	OUString sName;
223 	XMLFontAutoStylePoolEntry_Impl aTmp( rFamilyName, rStyleName, nFamily,
224 									 	 nPitch, eEnc );
225 	sal_uLong nPos;
226 	if( pPool->Seek_Entry( &aTmp, &nPos ) )
227 	{
228 		sName = pPool->GetObject( nPos )->GetName();
229 	}
230 
231 	return sName;
232 }
233 
234 
exportXML()235 void XMLFontAutoStylePool::exportXML()
236 {
237 	SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_OFFICE,
238 							  XML_FONT_FACE_DECLS,
239 							  sal_True, sal_True );
240 	Any aAny;
241 	OUString sTmp;
242 	XMLFontFamilyNamePropHdl aFamilyNameHdl;
243 	XMLFontFamilyPropHdl aFamilyHdl;
244 	XMLFontPitchPropHdl aPitchHdl;
245 	XMLFontEncodingPropHdl aEncHdl;
246 	const SvXMLUnitConverter& rUnitConv = GetExport().GetMM100UnitConverter();
247 
248 	sal_uInt32 nCount = pPool->Count();
249 	for( sal_uInt32 i=0; i<nCount; i++ )
250 	{
251 		const XMLFontAutoStylePoolEntry_Impl *pEntry = pPool->GetObject( i );
252 
253 		GetExport().AddAttribute( XML_NAMESPACE_STYLE,
254 								  XML_NAME, pEntry->GetName() );
255 
256 		aAny <<= pEntry->GetFamilyName();
257 		if( aFamilyNameHdl.exportXML( sTmp, aAny, rUnitConv ) )
258 			GetExport().AddAttribute( XML_NAMESPACE_SVG,
259 									  XML_FONT_FAMILY, sTmp );
260 
261 		const OUString& rStyleName = pEntry->GetStyleName();
262 		if( rStyleName.getLength() )
263 			GetExport().AddAttribute( XML_NAMESPACE_STYLE,
264 									  XML_FONT_ADORNMENTS,
265 									  rStyleName );
266 
267 		aAny <<= (sal_Int16)pEntry->GetFamily();
268 		if( aFamilyHdl.exportXML( sTmp, aAny, rUnitConv  ) )
269 			GetExport().AddAttribute( XML_NAMESPACE_STYLE,
270 									  XML_FONT_FAMILY_GENERIC, sTmp );
271 
272 		aAny <<= (sal_Int16)pEntry->GetPitch();
273 		if( aPitchHdl.exportXML( sTmp, aAny, rUnitConv  ) )
274 			GetExport().AddAttribute( XML_NAMESPACE_STYLE,
275 									  XML_FONT_PITCH, sTmp );
276 
277 		aAny <<= (sal_Int16)pEntry->GetEncoding();
278 		if( aEncHdl.exportXML( sTmp, aAny, rUnitConv  ) )
279 			GetExport().AddAttribute( XML_NAMESPACE_STYLE,
280 									  XML_FONT_CHARSET, sTmp );
281 
282 		SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_STYLE,
283 								  XML_FONT_FACE,
284 								  sal_True, sal_True );
285 	}
286 }
287 
288 
289