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