xref: /trunk/main/xmloff/source/style/xmltabi.cxx (revision 63bba73c)
1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*63bba73cSAndrew Rist  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*63bba73cSAndrew Rist  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19*63bba73cSAndrew Rist  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir #include <com/sun/star/style/TabAlign.hpp>
27cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
28cdf0e10cSrcweir #include <xmloff/xmltkmap.hxx>
29cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
30cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
31cdf0e10cSrcweir #include <xmloff/xmlimp.hxx>
32cdf0e10cSrcweir #include <com/sun/star/style/TabStop.hpp>
33cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
34cdf0e10cSrcweir #include "xmloff/i18nmap.hxx"
35cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include "xmltabi.hxx"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #define _SVSTDARR_USHORTS
40cdf0e10cSrcweir #include <svl/svstdarr.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir using ::rtl::OUString;
43cdf0e10cSrcweir using ::rtl::OUStringBuffer;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir using namespace ::com::sun::star;
46cdf0e10cSrcweir using namespace ::xmloff::token;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // ---
49cdf0e10cSrcweir 
50cdf0e10cSrcweir enum SvXMLTokenMapAttrs
51cdf0e10cSrcweir {
52cdf0e10cSrcweir 	XML_TOK_TABSTOP_POSITION,
53cdf0e10cSrcweir 	XML_TOK_TABSTOP_TYPE,
54cdf0e10cSrcweir 	XML_TOK_TABSTOP_CHAR,
55cdf0e10cSrcweir 	XML_TOK_TABSTOP_LEADER_STYLE,
56cdf0e10cSrcweir 	XML_TOK_TABSTOP_LEADER_TEXT,
57cdf0e10cSrcweir 	XML_TOK_TABSTOP_END=XML_TOK_UNKNOWN
58cdf0e10cSrcweir };
59cdf0e10cSrcweir 
60cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aTabsAttributesAttrTokenMap[] =
61cdf0e10cSrcweir {
62cdf0e10cSrcweir 	{ XML_NAMESPACE_STYLE, XML_POSITION,	 XML_TOK_TABSTOP_POSITION },
63cdf0e10cSrcweir 	{ XML_NAMESPACE_STYLE, XML_TYPE,	  	 XML_TOK_TABSTOP_TYPE },
64cdf0e10cSrcweir 	{ XML_NAMESPACE_STYLE, XML_CHAR,	  	 XML_TOK_TABSTOP_CHAR },
65cdf0e10cSrcweir 	{ XML_NAMESPACE_STYLE, XML_LEADER_TEXT,  XML_TOK_TABSTOP_LEADER_TEXT },
66cdf0e10cSrcweir 	{ XML_NAMESPACE_STYLE, XML_LEADER_STYLE,  XML_TOK_TABSTOP_LEADER_STYLE },
67cdf0e10cSrcweir 	XML_TOKEN_MAP_END
68cdf0e10cSrcweir };
69cdf0e10cSrcweir 
70cdf0e10cSrcweir // ---
71cdf0e10cSrcweir 
72cdf0e10cSrcweir class SvxXMLTabStopContext_Impl : public SvXMLImportContext
73cdf0e10cSrcweir {
74cdf0e10cSrcweir private:
75cdf0e10cSrcweir  	style::TabStop	aTabStop;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir public:
78cdf0e10cSrcweir 	TYPEINFO();
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	SvxXMLTabStopContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
81cdf0e10cSrcweir 							   const OUString& rLName,
82cdf0e10cSrcweir 							   const uno::Reference< xml::sax::XAttributeList > & xAttrList );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 	virtual ~SvxXMLTabStopContext_Impl();
85cdf0e10cSrcweir 
86cdf0e10cSrcweir 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
87cdf0e10cSrcweir 								   const OUString& rLocalName,
88cdf0e10cSrcweir 								   const uno::Reference< xml::sax::XAttributeList > & xAttrList );
89cdf0e10cSrcweir 
getTabStop() const90cdf0e10cSrcweir 	const style::TabStop& getTabStop() const { return aTabStop; }
91cdf0e10cSrcweir };
92cdf0e10cSrcweir 
93cdf0e10cSrcweir TYPEINIT1( SvxXMLTabStopContext_Impl, SvXMLImportContext );
94cdf0e10cSrcweir 
SvxXMLTabStopContext_Impl(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)95cdf0e10cSrcweir SvxXMLTabStopContext_Impl::SvxXMLTabStopContext_Impl(
96cdf0e10cSrcweir 							   SvXMLImport& rImport, sal_uInt16 nPrfx,
97cdf0e10cSrcweir 							   const OUString& rLName,
98cdf0e10cSrcweir 							   const uno::Reference< xml::sax::XAttributeList > & xAttrList )
99cdf0e10cSrcweir : SvXMLImportContext( rImport, nPrfx, rLName )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir 	aTabStop.Position = 0;
102cdf0e10cSrcweir 	aTabStop.Alignment = style::TabAlign_LEFT;
103cdf0e10cSrcweir 	aTabStop.DecimalChar = sal_Unicode( ',' );
104cdf0e10cSrcweir 	aTabStop.FillChar = sal_Unicode( ' ' );
105cdf0e10cSrcweir 	sal_Unicode cTextFillChar = 0;
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 	SvXMLTokenMap aTokenMap( aTabsAttributesAttrTokenMap );
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
110cdf0e10cSrcweir 	for( sal_Int16 i=0; i < nAttrCount; i++ )
111cdf0e10cSrcweir 	{
112cdf0e10cSrcweir 		const OUString& rAttrName = xAttrList->getNameByIndex( i );
113cdf0e10cSrcweir 		OUString aLocalName;
114cdf0e10cSrcweir 		sal_uInt16 nPrefix =
115cdf0e10cSrcweir 			GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
116cdf0e10cSrcweir 															&aLocalName );
117cdf0e10cSrcweir 		const OUString& rValue = xAttrList->getValueByIndex( i );
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 		sal_Int32 nVal;
120cdf0e10cSrcweir 		switch( aTokenMap.Get( nPrefix, aLocalName ) )
121cdf0e10cSrcweir 		{
122cdf0e10cSrcweir 		case XML_TOK_TABSTOP_POSITION:
123cdf0e10cSrcweir 			if( GetImport().GetMM100UnitConverter().convertMeasure( nVal,
124cdf0e10cSrcweir 																	rValue ) )
125cdf0e10cSrcweir 				aTabStop.Position = nVal;
126cdf0e10cSrcweir 			break;
127cdf0e10cSrcweir 		case XML_TOK_TABSTOP_TYPE:
128cdf0e10cSrcweir 			if( IsXMLToken( rValue, XML_LEFT ) )
129cdf0e10cSrcweir 			{
130cdf0e10cSrcweir 				aTabStop.Alignment = style::TabAlign_LEFT;
131cdf0e10cSrcweir 			}
132cdf0e10cSrcweir 			else if( IsXMLToken( rValue, XML_RIGHT ) )
133cdf0e10cSrcweir 			{
134cdf0e10cSrcweir 				aTabStop.Alignment = style::TabAlign_RIGHT;
135cdf0e10cSrcweir 			}
136cdf0e10cSrcweir 			else if( IsXMLToken( rValue, XML_CENTER ) )
137cdf0e10cSrcweir 			{
138cdf0e10cSrcweir 				aTabStop.Alignment = style::TabAlign_CENTER;
139cdf0e10cSrcweir 			}
140cdf0e10cSrcweir 			else if( IsXMLToken( rValue, XML_CHAR ) )
141cdf0e10cSrcweir 			{
142cdf0e10cSrcweir 				aTabStop.Alignment = style::TabAlign_DECIMAL;
143cdf0e10cSrcweir 			}
144cdf0e10cSrcweir 			else if( IsXMLToken( rValue, XML_DEFAULT ) )
145cdf0e10cSrcweir 			{
146cdf0e10cSrcweir 				aTabStop.Alignment = style::TabAlign_DEFAULT;
147cdf0e10cSrcweir 			}
148cdf0e10cSrcweir 			break;
149cdf0e10cSrcweir 		case XML_TOK_TABSTOP_CHAR:
150cdf0e10cSrcweir 			if( 0 != rValue.getLength() )
151cdf0e10cSrcweir 				aTabStop.DecimalChar = rValue[0];
152cdf0e10cSrcweir 			break;
153cdf0e10cSrcweir 		case XML_TOK_TABSTOP_LEADER_STYLE:
154cdf0e10cSrcweir 			if( IsXMLToken( rValue, XML_NONE ) )
155cdf0e10cSrcweir 				aTabStop.FillChar = ' ';
156cdf0e10cSrcweir 			else if( IsXMLToken( rValue, XML_DOTTED ) )
157cdf0e10cSrcweir 				aTabStop.FillChar = '.';
158cdf0e10cSrcweir 			else
159cdf0e10cSrcweir 				aTabStop.FillChar = '_';
160cdf0e10cSrcweir 			break;
161cdf0e10cSrcweir 		case XML_TOK_TABSTOP_LEADER_TEXT:
162cdf0e10cSrcweir 			if( 0 != rValue.getLength() )
163cdf0e10cSrcweir 				cTextFillChar = rValue[0];
164cdf0e10cSrcweir 			break;
165cdf0e10cSrcweir 		}
166cdf0e10cSrcweir 	}
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 	if( cTextFillChar != 0 && aTabStop.FillChar != ' ' )
169cdf0e10cSrcweir 		aTabStop.FillChar = cTextFillChar;
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
~SvxXMLTabStopContext_Impl()172cdf0e10cSrcweir SvxXMLTabStopContext_Impl::~SvxXMLTabStopContext_Impl()
173cdf0e10cSrcweir {
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> &)176cdf0e10cSrcweir SvXMLImportContext *SvxXMLTabStopContext_Impl::CreateChildContext(
177cdf0e10cSrcweir 								   sal_uInt16 nPrefix,
178cdf0e10cSrcweir 								   const OUString& rLocalName,
179cdf0e10cSrcweir 								   const uno::Reference< xml::sax::XAttributeList > & )
180cdf0e10cSrcweir {
181cdf0e10cSrcweir 	return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 
187cdf0e10cSrcweir typedef SvxXMLTabStopContext_Impl *SvxXMLTabStopContext_Impl_ImplPtr;
188cdf0e10cSrcweir SV_DECL_PTRARR( SvxXMLTabStopArray_Impl, SvxXMLTabStopContext_Impl_ImplPtr,	20, 5 )
189cdf0e10cSrcweir 
190cdf0e10cSrcweir 
191cdf0e10cSrcweir // ---
192cdf0e10cSrcweir 
193cdf0e10cSrcweir TYPEINIT1( SvxXMLTabStopImportContext, XMLElementPropertyContext );
194cdf0e10cSrcweir 
SvxXMLTabStopImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const XMLPropertyState & rProp,::std::vector<XMLPropertyState> & rProps)195cdf0e10cSrcweir SvxXMLTabStopImportContext::SvxXMLTabStopImportContext(
196cdf0e10cSrcweir 								SvXMLImport& rImport, sal_uInt16 nPrfx,
197cdf0e10cSrcweir 								const OUString& rLName,
198cdf0e10cSrcweir 								const XMLPropertyState& rProp,
199cdf0e10cSrcweir 				 				::std::vector< XMLPropertyState > &rProps )
200cdf0e10cSrcweir : XMLElementPropertyContext( rImport, nPrfx, rLName, rProp, rProps ),
201cdf0e10cSrcweir   mpTabStops( NULL )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir }
204cdf0e10cSrcweir 
~SvxXMLTabStopImportContext()205cdf0e10cSrcweir SvxXMLTabStopImportContext::~SvxXMLTabStopImportContext()
206cdf0e10cSrcweir {
207cdf0e10cSrcweir 	if( mpTabStops )
208cdf0e10cSrcweir 	{
209cdf0e10cSrcweir 		sal_uInt16 nCount = mpTabStops->Count();
210cdf0e10cSrcweir 		while( nCount )
211cdf0e10cSrcweir 		{
212cdf0e10cSrcweir 			nCount--;
213cdf0e10cSrcweir 			SvxXMLTabStopContext_Impl *pTabStop = (*mpTabStops)[nCount];
214cdf0e10cSrcweir 			mpTabStops->Remove( nCount, 1 );
215cdf0e10cSrcweir 			pTabStop->ReleaseRef();
216cdf0e10cSrcweir 		}
217cdf0e10cSrcweir 	}
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 	delete mpTabStops;
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)222cdf0e10cSrcweir SvXMLImportContext *SvxXMLTabStopImportContext::CreateChildContext(
223cdf0e10cSrcweir 								   sal_uInt16 nPrefix,
224cdf0e10cSrcweir 								   const OUString& rLocalName,
225cdf0e10cSrcweir 								   const uno::Reference< xml::sax::XAttributeList > & xAttrList )
226cdf0e10cSrcweir {
227cdf0e10cSrcweir 	SvXMLImportContext *pContext = 0;
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 	if( XML_NAMESPACE_STYLE == nPrefix && IsXMLToken( rLocalName, XML_TAB_STOP ) )
230cdf0e10cSrcweir 	{
231cdf0e10cSrcweir 		// create new tabstop import context
232cdf0e10cSrcweir 		SvxXMLTabStopContext_Impl *pTabStopContext =
233cdf0e10cSrcweir 			new SvxXMLTabStopContext_Impl( GetImport(), nPrefix, rLocalName,
234cdf0e10cSrcweir 										   xAttrList );
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 		// add new tabstop to array of tabstops
237cdf0e10cSrcweir 		if( !mpTabStops )
238cdf0e10cSrcweir 			mpTabStops = new SvxXMLTabStopArray_Impl;
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 		mpTabStops->Insert( pTabStopContext, mpTabStops->Count() );
241cdf0e10cSrcweir 		pTabStopContext->AddRef();
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 		pContext = pTabStopContext;
244cdf0e10cSrcweir 	}
245cdf0e10cSrcweir 	else
246cdf0e10cSrcweir 	{
247cdf0e10cSrcweir 		pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
248cdf0e10cSrcweir 	}
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 	return pContext;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
EndElement()253cdf0e10cSrcweir void SvxXMLTabStopImportContext::EndElement( )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir 	sal_uInt16 nCount = mpTabStops ? mpTabStops->Count() : 0;
256cdf0e10cSrcweir 	uno::Sequence< style::TabStop> aSeq( nCount );
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 	if( mpTabStops )
259cdf0e10cSrcweir 	{
260cdf0e10cSrcweir 		sal_uInt16 nNewCount = 0;
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 		style::TabStop* pTabStops = aSeq.getArray();
263cdf0e10cSrcweir 		for( sal_uInt16 i=0; i < nCount; i++ )
264cdf0e10cSrcweir 		{
265cdf0e10cSrcweir 			SvxXMLTabStopContext_Impl *pTabStopContext = (*mpTabStops)[i];
266cdf0e10cSrcweir 			const style::TabStop& rTabStop = pTabStopContext->getTabStop();
267cdf0e10cSrcweir 			sal_Bool bDflt = style::TabAlign_DEFAULT == rTabStop.Alignment;
268cdf0e10cSrcweir 			if( !bDflt || 0==i )
269cdf0e10cSrcweir 			{
270cdf0e10cSrcweir 				*pTabStops++ = pTabStopContext->getTabStop();
271cdf0e10cSrcweir 				nNewCount++;
272cdf0e10cSrcweir 			}
273cdf0e10cSrcweir 			if( bDflt && 0==i )
274cdf0e10cSrcweir 				break;
275cdf0e10cSrcweir 		}
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 		if( nCount != nNewCount )
278cdf0e10cSrcweir 			aSeq.realloc( nNewCount );
279cdf0e10cSrcweir 	}
280cdf0e10cSrcweir 	aProp.maValue <<= aSeq;
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 	SetInsert( sal_True );
283cdf0e10cSrcweir 	XMLElementPropertyContext::EndElement();
284cdf0e10cSrcweir 
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 
290