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