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 <xmloff/unointerfacetouniqueidentifiermapper.hxx>
21 : #include <rtl/ustring.hxx>
22 : #include <rtl/ustrbuf.hxx>
23 : #include <boost/ptr_container/ptr_vector.hpp>
24 :
25 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
26 : #include <com/sun/star/text/XTextFrame.hpp>
27 : #include <com/sun/star/text/XTextCursor.hpp>
28 : #include <com/sun/star/beans/XPropertySet.hpp>
29 : #include <com/sun/star/beans/XPropertySetInfo.hpp>
30 : #include <com/sun/star/text/ControlCharacter.hpp>
31 : #include <com/sun/star/container/XIndexReplace.hpp>
32 : #include <com/sun/star/drawing/XShapes.hpp>
33 : #include <com/sun/star/container/XEnumerationAccess.hpp>
34 : #include <com/sun/star/rdf/XMetadatable.hpp>
35 :
36 : #include <sax/tools/converter.hxx>
37 :
38 : #include <xmloff/xmlictxt.hxx>
39 : #include <xmloff/xmlimp.hxx>
40 : #include <xmloff/xmltoken.hxx>
41 : #include <xmloff/nmspmap.hxx>
42 : #include <xmloff/xmlnmspe.hxx>
43 : #include <xmloff/txtimp.hxx>
44 : #include "txtparai.hxx"
45 : #include "txtfldi.hxx"
46 : #include "XMLFootnoteImportContext.hxx"
47 : #include "XMLTextMarkImportContext.hxx"
48 : #include "XMLTextFrameContext.hxx"
49 : #include <xmloff/XMLCharContext.hxx>
50 : #include "XMLTextFrameHyperlinkContext.hxx"
51 : #include <xmloff/XMLEventsImportContext.hxx>
52 : #include "XMLChangeImportContext.hxx"
53 : #include "txtlists.hxx"
54 :
55 : #include <txtparaimphint.hxx>
56 10444 : class XMLHints_Impl : public boost::ptr_vector<XMLHint_Impl> {};
57 :
58 : using namespace ::com::sun::star;
59 : using namespace ::com::sun::star::uno;
60 : using namespace ::com::sun::star::text;
61 : using namespace ::com::sun::star::drawing;
62 : using namespace ::com::sun::star::beans;
63 : using namespace ::xmloff::token;
64 : using ::com::sun::star::container::XEnumerationAccess;
65 : using ::com::sun::star::container::XEnumeration;
66 :
67 0 : TYPEINIT1( XMLCharContext, SvXMLImportContext );
68 :
69 5747 : XMLCharContext::XMLCharContext(
70 : SvXMLImport& rImport,
71 : sal_uInt16 nPrfx,
72 : const OUString& rLName,
73 : const Reference< xml::sax::XAttributeList > & xAttrList,
74 : sal_Unicode c,
75 : bool bCount ) :
76 : SvXMLImportContext( rImport, nPrfx, rLName )
77 : ,m_nControl(0)
78 : ,m_nCount(1)
79 5747 : ,m_c(c)
80 : {
81 5747 : if( bCount )
82 : {
83 4383 : const SvXMLNamespaceMap& rMap = GetImport().GetNamespaceMap();
84 4383 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
85 8090 : for( sal_Int16 i=0; i < nAttrCount; i++ )
86 : {
87 3707 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
88 :
89 7414 : OUString aLocalName;
90 3707 : sal_uInt16 nPrefix =rMap.GetKeyByAttrName( rAttrName,&aLocalName );
91 7414 : if( XML_NAMESPACE_TEXT == nPrefix &&
92 3707 : IsXMLToken( aLocalName, XML_C ) )
93 : {
94 3693 : sal_Int32 nTmp = xAttrList->getValueByIndex(i).toInt32();
95 3693 : if( nTmp > 0L )
96 : {
97 3693 : if( nTmp > USHRT_MAX )
98 0 : m_nCount = USHRT_MAX;
99 : else
100 3693 : m_nCount = (sal_uInt16)nTmp;
101 : }
102 : }
103 3707 : }
104 : }
105 5747 : }
106 :
107 562 : XMLCharContext::XMLCharContext(
108 : SvXMLImport& rImp,
109 : sal_uInt16 nPrfx,
110 : const OUString& rLName,
111 : const Reference< xml::sax::XAttributeList > &,
112 : sal_Int16 nControl ) :
113 : SvXMLImportContext( rImp, nPrfx, rLName )
114 : ,m_nControl(nControl)
115 : ,m_nCount(0)
116 562 : ,m_c(0)
117 : {
118 562 : }
119 :
120 12618 : XMLCharContext::~XMLCharContext()
121 : {
122 12618 : }
123 6309 : void XMLCharContext::EndElement()
124 : {
125 6309 : if ( !m_nCount )
126 562 : InsertControlCharacter( m_nControl );
127 : else
128 : {
129 5747 : if( 1U == m_nCount )
130 : {
131 3908 : OUString sBuff( &m_c, 1 );
132 3908 : InsertString(sBuff);
133 : }
134 : else
135 : {
136 1839 : OUStringBuffer sBuff(static_cast<int>(m_nCount));
137 11915 : while( m_nCount-- )
138 8237 : sBuff.append( &m_c, 1 );
139 :
140 1839 : InsertString(sBuff.makeStringAndClear() );
141 : }
142 : }
143 6309 : }
144 562 : void XMLCharContext::InsertControlCharacter(sal_Int16 _nControl)
145 : {
146 562 : GetImport().GetTextImport()->InsertControlCharacter( _nControl );
147 562 : }
148 5747 : void XMLCharContext::InsertString(const OUString& _sString)
149 : {
150 5747 : GetImport().GetTextImport()->InsertString( _sString );
151 5747 : }
152 :
153 : /** import start of reference (<text:reference-start>) */
154 0 : class XMLStartReferenceContext_Impl : public SvXMLImportContext
155 : {
156 : public:
157 : TYPEINFO_OVERRIDE();
158 :
159 : // Do everything in constructor. Well ...
160 : XMLStartReferenceContext_Impl (
161 : SvXMLImport& rImport,
162 : sal_uInt16 nPrefix,
163 : const OUString& rLocalName,
164 : XMLHints_Impl& rHnts,
165 : const Reference<xml::sax::XAttributeList> & xAttrList);
166 :
167 : static bool FindName(
168 : SvXMLImport& rImport,
169 : const Reference<xml::sax::XAttributeList> & xAttrList,
170 : OUString& rName);
171 : };
172 :
173 0 : TYPEINIT1( XMLStartReferenceContext_Impl, SvXMLImportContext );
174 :
175 0 : XMLStartReferenceContext_Impl::XMLStartReferenceContext_Impl(
176 : SvXMLImport& rImport,
177 : sal_uInt16 nPrefix,
178 : const OUString& rLocalName,
179 : XMLHints_Impl& rHints,
180 : const Reference<xml::sax::XAttributeList> & xAttrList) :
181 0 : SvXMLImportContext(rImport, nPrefix, rLocalName)
182 : {
183 0 : OUString sName;
184 :
185 0 : if (FindName(GetImport(), xAttrList, sName))
186 : {
187 : XMLHint_Impl* pHint = new XMLReferenceHint_Impl(
188 0 : sName, rImport.GetTextImport()->GetCursor()->getStart() );
189 :
190 : // degenerates to point reference, if no end is found!
191 0 : pHint->SetEnd(rImport.GetTextImport()->GetCursor()->getStart() );
192 :
193 0 : rHints.push_back(pHint);
194 0 : }
195 0 : }
196 :
197 0 : bool XMLStartReferenceContext_Impl::FindName(
198 : SvXMLImport& rImport,
199 : const Reference<xml::sax::XAttributeList> & xAttrList,
200 : OUString& rName)
201 : {
202 0 : bool bNameOK( false );
203 :
204 : // find name attribute first
205 0 : const sal_Int16 nLength( xAttrList->getLength() );
206 0 : for (sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
207 : {
208 0 : OUString sLocalName;
209 0 : const sal_uInt16 nPrefix = rImport.GetNamespaceMap().
210 0 : GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
211 0 : &sLocalName );
212 :
213 0 : if ( (XML_NAMESPACE_TEXT == nPrefix) &&
214 0 : IsXMLToken(sLocalName, XML_NAME) )
215 : {
216 0 : rName = xAttrList->getValueByIndex(nAttr);
217 0 : bNameOK = true;
218 : }
219 0 : }
220 :
221 0 : return bNameOK;
222 : }
223 :
224 : /** import end of reference (<text:reference-end>) */
225 0 : class XMLEndReferenceContext_Impl : public SvXMLImportContext
226 : {
227 : public:
228 : TYPEINFO_OVERRIDE();
229 :
230 : // Do everything in constructor. Well ...
231 : XMLEndReferenceContext_Impl(
232 : SvXMLImport& rImport,
233 : sal_uInt16 nPrefix,
234 : const OUString& rLocalName,
235 : XMLHints_Impl& rHnts,
236 : const Reference<xml::sax::XAttributeList> & xAttrList);
237 : };
238 :
239 0 : TYPEINIT1( XMLEndReferenceContext_Impl, SvXMLImportContext );
240 :
241 0 : XMLEndReferenceContext_Impl::XMLEndReferenceContext_Impl(
242 : SvXMLImport& rImport,
243 : sal_uInt16 nPrefix,
244 : const OUString& rLocalName,
245 : XMLHints_Impl& rHints,
246 : const Reference<xml::sax::XAttributeList> & xAttrList) :
247 0 : SvXMLImportContext(rImport, nPrefix, rLocalName)
248 : {
249 0 : OUString sName;
250 :
251 : // borrow from XMLStartReferenceContext_Impl
252 0 : if (XMLStartReferenceContext_Impl::FindName(GetImport(), xAttrList, sName))
253 : {
254 : // search for reference start
255 0 : sal_uInt16 nCount = rHints.size();
256 0 : for(sal_uInt16 nPos = 0; nPos < nCount; nPos++)
257 : {
258 0 : XMLHint_Impl *pHint = &rHints[nPos];
259 0 : if ( pHint->IsReference() &&
260 0 : sName.equals( static_cast<XMLReferenceHint_Impl *>(pHint)->GetRefName()) )
261 : {
262 : // set end and stop searching
263 0 : pHint->SetEnd(GetImport().GetTextImport()->
264 0 : GetCursor()->getStart() );
265 0 : break;
266 : }
267 : }
268 : // else: no start (in this paragraph) -> ignore
269 0 : }
270 0 : }
271 :
272 : class XMLImpSpanContext_Impl : public SvXMLImportContext
273 : {
274 : XMLHints_Impl& rHints;
275 : XMLStyleHint_Impl *pHint;
276 :
277 : bool& rIgnoreLeadingSpace;
278 :
279 : sal_uInt8 nStarFontsConvFlags;
280 :
281 : public:
282 :
283 : TYPEINFO_OVERRIDE();
284 :
285 : XMLImpSpanContext_Impl(
286 : SvXMLImport& rImport,
287 : sal_uInt16 nPrfx,
288 : const OUString& rLName,
289 : const Reference< xml::sax::XAttributeList > & xAttrList,
290 : XMLHints_Impl& rHnts,
291 : bool& rIgnLeadSpace,
292 : sal_uInt8 nSFConvFlags
293 : );
294 :
295 : virtual ~XMLImpSpanContext_Impl();
296 :
297 : static SvXMLImportContext *CreateChildContext(
298 : SvXMLImport& rImport,
299 : sal_uInt16 nPrefix, const OUString& rLocalName,
300 : const Reference< xml::sax::XAttributeList > & xAttrList,
301 : sal_uInt16 nToken, XMLHints_Impl& rHnts,
302 : bool& rIgnLeadSpace,
303 : sal_uInt8 nStarFontsConvFlags = 0
304 : );
305 : virtual SvXMLImportContext *CreateChildContext(
306 : sal_uInt16 nPrefix, const OUString& rLocalName,
307 : const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
308 :
309 : virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
310 : };
311 :
312 : class XMLImpHyperlinkContext_Impl : public SvXMLImportContext
313 : {
314 : XMLHints_Impl& mrHints;
315 : XMLHyperlinkHint_Impl *mpHint;
316 :
317 : bool& mrbIgnoreLeadingSpace;
318 :
319 : public:
320 :
321 : TYPEINFO_OVERRIDE();
322 :
323 : XMLImpHyperlinkContext_Impl(
324 : SvXMLImport& rImport,
325 : sal_uInt16 nPrfx,
326 : const OUString& rLName,
327 : const Reference< xml::sax::XAttributeList > & xAttrList,
328 : XMLHints_Impl& rHnts,
329 : bool& rIgnLeadSpace );
330 :
331 : virtual ~XMLImpHyperlinkContext_Impl();
332 :
333 : virtual SvXMLImportContext *CreateChildContext(
334 : sal_uInt16 nPrefix, const OUString& rLocalName,
335 : const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
336 :
337 : virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
338 : };
339 :
340 0 : TYPEINIT1( XMLImpHyperlinkContext_Impl, SvXMLImportContext );
341 :
342 64 : XMLImpHyperlinkContext_Impl::XMLImpHyperlinkContext_Impl(
343 : SvXMLImport& rImport,
344 : sal_uInt16 nPrfx,
345 : const OUString& rLName,
346 : const Reference< xml::sax::XAttributeList > & xAttrList,
347 : XMLHints_Impl& rHnts,
348 : bool& rIgnLeadSpace )
349 : : SvXMLImportContext( rImport, nPrfx, rLName )
350 : , mrHints( rHnts )
351 192 : , mpHint( new XMLHyperlinkHint_Impl( GetImport().GetTextImport()->GetCursorAsRange()->getStart() ) )
352 256 : , mrbIgnoreLeadingSpace( rIgnLeadSpace )
353 : {
354 64 : OUString sShow;
355 64 : const SvXMLTokenMap& rTokenMap = GetImport().GetTextImport()->GetTextHyperlinkAttrTokenMap();
356 :
357 64 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
358 228 : for ( sal_Int16 i = 0; i < nAttrCount; i++ )
359 : {
360 164 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
361 328 : const OUString& rValue = xAttrList->getValueByIndex( i );
362 :
363 328 : OUString aLocalName;
364 164 : const sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
365 164 : switch (rTokenMap.Get( nPrefix, aLocalName ))
366 : {
367 : case XML_TOK_TEXT_HYPERLINK_HREF:
368 64 : mpHint->SetHRef( GetImport().GetAbsoluteReference( rValue ) );
369 64 : break;
370 : case XML_TOK_TEXT_HYPERLINK_NAME:
371 0 : mpHint->SetName( rValue );
372 0 : break;
373 : case XML_TOK_TEXT_HYPERLINK_TARGET_FRAME:
374 0 : mpHint->SetTargetFrameName( rValue );
375 0 : break;
376 : case XML_TOK_TEXT_HYPERLINK_SHOW:
377 0 : sShow = rValue;
378 0 : break;
379 : case XML_TOK_TEXT_HYPERLINK_STYLE_NAME:
380 18 : mpHint->SetStyleName( rValue );
381 18 : break;
382 : case XML_TOK_TEXT_HYPERLINK_VIS_STYLE_NAME:
383 18 : mpHint->SetVisitedStyleName( rValue );
384 18 : break;
385 : }
386 164 : }
387 :
388 64 : if( !sShow.isEmpty() && mpHint->GetTargetFrameName().isEmpty() )
389 : {
390 0 : if( IsXMLToken( sShow, XML_NEW ) )
391 : mpHint->SetTargetFrameName(
392 0 : OUString( "_blank" ) );
393 0 : else if( IsXMLToken( sShow, XML_REPLACE ) )
394 : mpHint->SetTargetFrameName(
395 0 : OUString( "_self" ) );
396 : }
397 :
398 64 : if ( mpHint->GetHRef().isEmpty() )
399 : {
400 : // hyperlink without an URL is not imported.
401 0 : delete mpHint;
402 0 : mpHint = NULL;
403 : }
404 : else
405 : {
406 64 : mrHints.push_back( mpHint );
407 64 : }
408 64 : }
409 :
410 192 : XMLImpHyperlinkContext_Impl::~XMLImpHyperlinkContext_Impl()
411 : {
412 64 : if( mpHint != NULL )
413 64 : mpHint->SetEnd( GetImport().GetTextImport()
414 64 : ->GetCursorAsRange()->getStart() );
415 128 : }
416 :
417 48 : SvXMLImportContext *XMLImpHyperlinkContext_Impl::CreateChildContext(
418 : sal_uInt16 nPrefix, const OUString& rLocalName,
419 : const Reference< xml::sax::XAttributeList > & xAttrList )
420 : {
421 48 : if ( (nPrefix == XML_NAMESPACE_OFFICE) &&
422 0 : IsXMLToken(rLocalName, XML_EVENT_LISTENERS) )
423 : {
424 : XMLEventsImportContext* pCtxt = new XMLEventsImportContext(
425 0 : GetImport(), nPrefix, rLocalName);
426 0 : mpHint->SetEventsContext(pCtxt);
427 0 : return pCtxt;
428 : }
429 : else
430 : {
431 : const SvXMLTokenMap& rTokenMap =
432 48 : GetImport().GetTextImport()->GetTextPElemTokenMap();
433 48 : sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
434 :
435 : return XMLImpSpanContext_Impl::CreateChildContext(
436 48 : GetImport(), nPrefix, rLocalName, xAttrList,
437 96 : nToken, mrHints, mrbIgnoreLeadingSpace );
438 : }
439 : }
440 :
441 64 : void XMLImpHyperlinkContext_Impl::Characters( const OUString& rChars )
442 : {
443 64 : GetImport().GetTextImport()->InsertString( rChars, mrbIgnoreLeadingSpace );
444 64 : }
445 :
446 : class XMLImpRubyBaseContext_Impl : public SvXMLImportContext
447 : {
448 : XMLHints_Impl& rHints;
449 :
450 : bool& rIgnoreLeadingSpace;
451 :
452 : public:
453 :
454 : TYPEINFO_OVERRIDE();
455 :
456 : XMLImpRubyBaseContext_Impl(
457 : SvXMLImport& rImport,
458 : sal_uInt16 nPrfx,
459 : const OUString& rLName,
460 : const Reference< xml::sax::XAttributeList > & xAttrList,
461 : XMLHints_Impl& rHnts,
462 : bool& rIgnLeadSpace );
463 :
464 : virtual ~XMLImpRubyBaseContext_Impl();
465 :
466 : virtual SvXMLImportContext *CreateChildContext(
467 : sal_uInt16 nPrefix, const OUString& rLocalName,
468 : const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
469 :
470 : virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
471 : };
472 :
473 0 : TYPEINIT1( XMLImpRubyBaseContext_Impl, SvXMLImportContext );
474 :
475 12 : XMLImpRubyBaseContext_Impl::XMLImpRubyBaseContext_Impl(
476 : SvXMLImport& rImport,
477 : sal_uInt16 nPrfx,
478 : const OUString& rLName,
479 : const Reference< xml::sax::XAttributeList > &,
480 : XMLHints_Impl& rHnts,
481 : bool& rIgnLeadSpace ) :
482 : SvXMLImportContext( rImport, nPrfx, rLName ),
483 : rHints( rHnts ),
484 12 : rIgnoreLeadingSpace( rIgnLeadSpace )
485 : {
486 12 : }
487 :
488 24 : XMLImpRubyBaseContext_Impl::~XMLImpRubyBaseContext_Impl()
489 : {
490 24 : }
491 :
492 6 : SvXMLImportContext *XMLImpRubyBaseContext_Impl::CreateChildContext(
493 : sal_uInt16 nPrefix, const OUString& rLocalName,
494 : const Reference< xml::sax::XAttributeList > & xAttrList )
495 : {
496 : const SvXMLTokenMap& rTokenMap =
497 6 : GetImport().GetTextImport()->GetTextPElemTokenMap();
498 6 : sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
499 :
500 6 : return XMLImpSpanContext_Impl::CreateChildContext( GetImport(), nPrefix,
501 : rLocalName, xAttrList,
502 12 : nToken, rHints, rIgnoreLeadingSpace );
503 : }
504 :
505 6 : void XMLImpRubyBaseContext_Impl::Characters( const OUString& rChars )
506 : {
507 6 : GetImport().GetTextImport()->InsertString( rChars, rIgnoreLeadingSpace );
508 6 : }
509 :
510 : class XMLImpRubyContext_Impl : public SvXMLImportContext
511 : {
512 : XMLHints_Impl& rHints;
513 :
514 : bool& rIgnoreLeadingSpace;
515 :
516 : Reference < XTextRange > m_xStart;
517 : OUString m_sStyleName;
518 : OUString m_sTextStyleName;
519 : OUString m_sText;
520 :
521 : public:
522 :
523 : TYPEINFO_OVERRIDE();
524 :
525 : XMLImpRubyContext_Impl(
526 : SvXMLImport& rImport,
527 : sal_uInt16 nPrfx,
528 : const OUString& rLName,
529 : const Reference< xml::sax::XAttributeList > & xAttrList,
530 : XMLHints_Impl& rHnts,
531 : bool& rIgnLeadSpace );
532 :
533 : virtual ~XMLImpRubyContext_Impl();
534 :
535 : virtual SvXMLImportContext *CreateChildContext(
536 : sal_uInt16 nPrefix, const OUString& rLocalName,
537 : const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
538 :
539 0 : void SetTextStyleName( const OUString& s ) { m_sTextStyleName = s; }
540 12 : void AppendText( const OUString& s ) { m_sText += s; }
541 : };
542 :
543 : class XMLImpRubyTextContext_Impl : public SvXMLImportContext
544 : {
545 : XMLImpRubyContext_Impl & m_rRubyContext;
546 :
547 : public:
548 :
549 : TYPEINFO_OVERRIDE();
550 :
551 : XMLImpRubyTextContext_Impl(
552 : SvXMLImport& rImport,
553 : sal_uInt16 nPrfx,
554 : const OUString& rLName,
555 : const Reference< xml::sax::XAttributeList > & xAttrList,
556 : XMLImpRubyContext_Impl & rParent );
557 :
558 : virtual ~XMLImpRubyTextContext_Impl();
559 :
560 : virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
561 : };
562 :
563 0 : TYPEINIT1( XMLImpRubyTextContext_Impl, SvXMLImportContext );
564 :
565 12 : XMLImpRubyTextContext_Impl::XMLImpRubyTextContext_Impl(
566 : SvXMLImport& rImport,
567 : sal_uInt16 nPrfx,
568 : const OUString& rLName,
569 : const Reference< xml::sax::XAttributeList > & xAttrList,
570 : XMLImpRubyContext_Impl & rParent )
571 : : SvXMLImportContext( rImport, nPrfx, rLName )
572 12 : , m_rRubyContext( rParent )
573 : {
574 12 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
575 12 : for( sal_Int16 i=0; i < nAttrCount; i++ )
576 : {
577 0 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
578 0 : const OUString& rValue = xAttrList->getValueByIndex( i );
579 :
580 0 : OUString aLocalName;
581 : sal_uInt16 nPrefix =
582 0 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
583 0 : &aLocalName );
584 0 : if( XML_NAMESPACE_TEXT == nPrefix &&
585 0 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
586 : {
587 0 : m_rRubyContext.SetTextStyleName( rValue );
588 0 : break;
589 : }
590 0 : }
591 12 : }
592 :
593 24 : XMLImpRubyTextContext_Impl::~XMLImpRubyTextContext_Impl()
594 : {
595 24 : }
596 :
597 12 : void XMLImpRubyTextContext_Impl::Characters( const OUString& rChars )
598 : {
599 12 : m_rRubyContext.AppendText( rChars );
600 12 : }
601 :
602 0 : TYPEINIT1( XMLImpRubyContext_Impl, SvXMLImportContext );
603 :
604 12 : XMLImpRubyContext_Impl::XMLImpRubyContext_Impl(
605 : SvXMLImport& rImport,
606 : sal_uInt16 nPrfx,
607 : const OUString& rLName,
608 : const Reference< xml::sax::XAttributeList > & xAttrList,
609 : XMLHints_Impl& rHnts,
610 : bool& rIgnLeadSpace ) :
611 : SvXMLImportContext( rImport, nPrfx, rLName ),
612 : rHints( rHnts ),
613 : rIgnoreLeadingSpace( rIgnLeadSpace )
614 12 : , m_xStart( GetImport().GetTextImport()->GetCursorAsRange()->getStart() )
615 : {
616 12 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
617 12 : for( sal_Int16 i=0; i < nAttrCount; i++ )
618 : {
619 12 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
620 12 : const OUString& rValue = xAttrList->getValueByIndex( i );
621 :
622 12 : OUString aLocalName;
623 : sal_uInt16 nPrefix =
624 12 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
625 12 : &aLocalName );
626 24 : if( XML_NAMESPACE_TEXT == nPrefix &&
627 12 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
628 : {
629 12 : m_sStyleName = rValue;
630 12 : break;
631 : }
632 0 : }
633 12 : }
634 :
635 36 : XMLImpRubyContext_Impl::~XMLImpRubyContext_Impl()
636 : {
637 : const rtl::Reference < XMLTextImportHelper > xTextImport(
638 12 : GetImport().GetTextImport());
639 : const Reference < XTextCursor > xAttrCursor(
640 24 : xTextImport->GetText()->createTextCursorByRange( m_xStart ));
641 24 : xAttrCursor->gotoRange(xTextImport->GetCursorAsRange()->getStart(),
642 24 : sal_True);
643 12 : xTextImport->SetRuby( GetImport(), xAttrCursor,
644 36 : m_sStyleName, m_sTextStyleName, m_sText );
645 24 : }
646 :
647 24 : SvXMLImportContext *XMLImpRubyContext_Impl::CreateChildContext(
648 : sal_uInt16 nPrefix, const OUString& rLocalName,
649 : const Reference< xml::sax::XAttributeList > & xAttrList )
650 : {
651 : SvXMLImportContext *pContext;
652 24 : if( XML_NAMESPACE_TEXT == nPrefix )
653 : {
654 24 : if( IsXMLToken( rLocalName, XML_RUBY_BASE ) )
655 12 : pContext = new XMLImpRubyBaseContext_Impl( GetImport(), nPrefix,
656 : rLocalName,
657 : xAttrList,
658 : rHints,
659 12 : rIgnoreLeadingSpace );
660 12 : else if( IsXMLToken( rLocalName, XML_RUBY_TEXT ) )
661 12 : pContext = new XMLImpRubyTextContext_Impl( GetImport(), nPrefix,
662 : rLocalName,
663 : xAttrList,
664 12 : *this );
665 : else
666 : pContext = new SvXMLImportContext(
667 0 : GetImport(), nPrefix, rLocalName );
668 : }
669 : else
670 : pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName,
671 0 : xAttrList );
672 :
673 24 : return pContext;
674 : }
675 :
676 : /** for text:meta and text:meta-field
677 : */
678 : class XMLMetaImportContextBase : public SvXMLImportContext
679 : {
680 : XMLHints_Impl& m_rHints;
681 :
682 : bool& m_rIgnoreLeadingSpace;
683 :
684 : /// start position
685 : Reference<XTextRange> m_xStart;
686 :
687 : protected:
688 : OUString m_XmlId;
689 :
690 : public:
691 : TYPEINFO_OVERRIDE();
692 :
693 : XMLMetaImportContextBase(
694 : SvXMLImport& i_rImport,
695 : const sal_uInt16 i_nPrefix,
696 : const OUString& i_rLocalName,
697 : XMLHints_Impl& i_rHints,
698 : bool & i_rIgnoreLeadingSpace );
699 :
700 : virtual ~XMLMetaImportContextBase();
701 :
702 : virtual void StartElement(
703 : const Reference<xml::sax::XAttributeList> & i_xAttrList) SAL_OVERRIDE;
704 :
705 : virtual void EndElement() SAL_OVERRIDE;
706 :
707 : virtual SvXMLImportContext *CreateChildContext(
708 : sal_uInt16 i_nPrefix, const OUString& i_rLocalName,
709 : const Reference< xml::sax::XAttributeList > & i_xAttrList) SAL_OVERRIDE;
710 :
711 : virtual void Characters( const OUString& i_rChars ) SAL_OVERRIDE;
712 :
713 : virtual void ProcessAttribute(sal_uInt16 const i_nPrefix,
714 : OUString const & i_rLocalName, OUString const & i_rValue);
715 :
716 : virtual void InsertMeta(const Reference<XTextRange> & i_xInsertionRange)
717 : = 0;
718 : };
719 :
720 0 : TYPEINIT1( XMLMetaImportContextBase, SvXMLImportContext );
721 :
722 40 : XMLMetaImportContextBase::XMLMetaImportContextBase(
723 : SvXMLImport& i_rImport,
724 : const sal_uInt16 i_nPrefix,
725 : const OUString& i_rLocalName,
726 : XMLHints_Impl& i_rHints,
727 : bool & i_rIgnoreLeadingSpace )
728 : : SvXMLImportContext( i_rImport, i_nPrefix, i_rLocalName )
729 : , m_rHints( i_rHints )
730 : , m_rIgnoreLeadingSpace( i_rIgnoreLeadingSpace )
731 40 : , m_xStart( GetImport().GetTextImport()->GetCursorAsRange()->getStart() )
732 : {
733 40 : }
734 :
735 40 : XMLMetaImportContextBase::~XMLMetaImportContextBase()
736 : {
737 40 : }
738 :
739 40 : void XMLMetaImportContextBase::StartElement(
740 : const Reference<xml::sax::XAttributeList> & i_xAttrList)
741 : {
742 40 : const sal_Int16 nAttrCount(i_xAttrList.is() ? i_xAttrList->getLength() : 0);
743 91 : for ( sal_Int16 i = 0; i < nAttrCount; ++i )
744 : {
745 51 : const OUString& rAttrName( i_xAttrList->getNameByIndex( i ) );
746 102 : const OUString& rValue( i_xAttrList->getValueByIndex( i ) );
747 :
748 102 : OUString sLocalName;
749 : const sal_uInt16 nPrefix(
750 51 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
751 51 : &sLocalName ));
752 51 : ProcessAttribute(nPrefix, sLocalName, rValue);
753 51 : }
754 40 : }
755 :
756 40 : void XMLMetaImportContextBase::EndElement()
757 : {
758 : SAL_WARN_IF(!m_xStart.is(), "xmloff.text", "no mxStart?");
759 80 : if (!m_xStart.is()) return;
760 :
761 : const Reference<XTextRange> xEndRange(
762 40 : GetImport().GetTextImport()->GetCursorAsRange()->getStart() );
763 :
764 : // create range for insertion
765 : const Reference<XTextCursor> xInsertionCursor(
766 80 : GetImport().GetTextImport()->GetText()->createTextCursorByRange(
767 80 : xEndRange) );
768 40 : xInsertionCursor->gotoRange(m_xStart, sal_True);
769 :
770 80 : InsertMeta(xInsertionCursor);
771 : }
772 :
773 14 : SvXMLImportContext * XMLMetaImportContextBase::CreateChildContext(
774 : sal_uInt16 i_nPrefix, const OUString& i_rLocalName,
775 : const Reference< xml::sax::XAttributeList > & i_xAttrList )
776 : {
777 : const SvXMLTokenMap& rTokenMap(
778 14 : GetImport().GetTextImport()->GetTextPElemTokenMap() );
779 14 : const sal_uInt16 nToken( rTokenMap.Get( i_nPrefix, i_rLocalName ) );
780 :
781 14 : return XMLImpSpanContext_Impl::CreateChildContext( GetImport(), i_nPrefix,
782 28 : i_rLocalName, i_xAttrList, nToken, m_rHints, m_rIgnoreLeadingSpace );
783 : }
784 :
785 26 : void XMLMetaImportContextBase::Characters( const OUString& i_rChars )
786 : {
787 26 : GetImport().GetTextImport()->InsertString(i_rChars, m_rIgnoreLeadingSpace);
788 26 : }
789 :
790 39 : void XMLMetaImportContextBase::ProcessAttribute(sal_uInt16 const i_nPrefix,
791 : OUString const & i_rLocalName, OUString const & i_rValue)
792 : {
793 39 : if ( (XML_NAMESPACE_XML == i_nPrefix) && IsXMLToken(i_rLocalName, XML_ID) )
794 : {
795 37 : m_XmlId = i_rValue;
796 : }
797 39 : }
798 :
799 : /** text:meta */
800 38 : class XMLMetaImportContext : public XMLMetaImportContextBase
801 : {
802 : // RDFa
803 : bool m_bHaveAbout;
804 : OUString m_sAbout;
805 : OUString m_sProperty;
806 : OUString m_sContent;
807 : OUString m_sDatatype;
808 :
809 : public:
810 : TYPEINFO_OVERRIDE();
811 :
812 : XMLMetaImportContext(
813 : SvXMLImport& i_rImport,
814 : const sal_uInt16 i_nPrefix,
815 : const OUString& i_rLocalName,
816 : XMLHints_Impl& i_rHints,
817 : bool & i_rIgnoreLeadingSpace );
818 :
819 : virtual void ProcessAttribute(sal_uInt16 const i_nPrefix,
820 : OUString const & i_rLocalName, OUString const & i_rValue) SAL_OVERRIDE;
821 :
822 : virtual void InsertMeta(const Reference<XTextRange> & i_xInsertionRange) SAL_OVERRIDE;
823 : };
824 :
825 0 : TYPEINIT1( XMLMetaImportContext, XMLMetaImportContextBase );
826 :
827 19 : XMLMetaImportContext::XMLMetaImportContext(
828 : SvXMLImport& i_rImport,
829 : const sal_uInt16 i_nPrefix,
830 : const OUString& i_rLocalName,
831 : XMLHints_Impl& i_rHints,
832 : bool & i_rIgnoreLeadingSpace )
833 : : XMLMetaImportContextBase( i_rImport, i_nPrefix, i_rLocalName,
834 : i_rHints, i_rIgnoreLeadingSpace )
835 19 : , m_bHaveAbout(false)
836 : {
837 19 : }
838 :
839 27 : void XMLMetaImportContext::ProcessAttribute(sal_uInt16 const i_nPrefix,
840 : OUString const & i_rLocalName, OUString const & i_rValue)
841 : {
842 27 : if ( XML_NAMESPACE_XHTML == i_nPrefix )
843 : {
844 : // RDFa
845 8 : if ( IsXMLToken( i_rLocalName, XML_ABOUT) )
846 : {
847 2 : m_sAbout = i_rValue;
848 2 : m_bHaveAbout = true;
849 : }
850 6 : else if ( IsXMLToken( i_rLocalName, XML_PROPERTY) )
851 : {
852 2 : m_sProperty = i_rValue;
853 : }
854 4 : else if ( IsXMLToken( i_rLocalName, XML_CONTENT) )
855 : {
856 2 : m_sContent = i_rValue;
857 : }
858 2 : else if ( IsXMLToken( i_rLocalName, XML_DATATYPE) )
859 : {
860 2 : m_sDatatype = i_rValue;
861 : }
862 : }
863 : else
864 : {
865 : XMLMetaImportContextBase::ProcessAttribute(
866 19 : i_nPrefix, i_rLocalName, i_rValue);
867 : }
868 27 : }
869 :
870 19 : void XMLMetaImportContext::InsertMeta(
871 : const Reference<XTextRange> & i_xInsertionRange)
872 : {
873 : SAL_WARN_IF(m_bHaveAbout == m_sProperty.isEmpty(), "xmloff.text", "XMLMetaImportContext::InsertMeta: invalid RDFa?");
874 19 : if (!m_XmlId.isEmpty() || (m_bHaveAbout && !m_sProperty.isEmpty()))
875 : {
876 : // insert mark
877 : const uno::Reference<rdf::XMetadatable> xMeta(
878 : XMLTextMarkImportContext::CreateAndInsertMark(
879 18 : GetImport(),
880 : OUString("com.sun.star.text.InContentMetadata"),
881 : OUString(),
882 : i_xInsertionRange, m_XmlId),
883 36 : uno::UNO_QUERY);
884 : SAL_WARN_IF(!xMeta.is(), "xmloff.text", "cannot insert Meta?");
885 :
886 18 : if (xMeta.is() && m_bHaveAbout)
887 : {
888 2 : GetImport().AddRDFa(xMeta,
889 4 : m_sAbout, m_sProperty, m_sContent, m_sDatatype);
890 18 : }
891 : }
892 : else
893 : {
894 : SAL_INFO("xmloff.text", "invalid <text:meta>: no xml:id, no valid RDFa");
895 : }
896 19 : }
897 :
898 : /** text:meta-field */
899 42 : class XMLMetaFieldImportContext : public XMLMetaImportContextBase
900 : {
901 : OUString m_DataStyleName;
902 :
903 : public:
904 : TYPEINFO_OVERRIDE();
905 :
906 : XMLMetaFieldImportContext(
907 : SvXMLImport& i_rImport,
908 : const sal_uInt16 i_nPrefix,
909 : const OUString& i_rLocalName,
910 : XMLHints_Impl& i_rHints,
911 : bool & i_rIgnoreLeadingSpace );
912 :
913 : virtual void ProcessAttribute(sal_uInt16 const i_nPrefix,
914 : OUString const & i_rLocalName, OUString const & i_rValue) SAL_OVERRIDE;
915 :
916 : virtual void InsertMeta(const Reference<XTextRange> & i_xInsertionRange) SAL_OVERRIDE;
917 : };
918 :
919 0 : TYPEINIT1( XMLMetaFieldImportContext, XMLMetaImportContextBase );
920 :
921 21 : XMLMetaFieldImportContext::XMLMetaFieldImportContext(
922 : SvXMLImport& i_rImport,
923 : const sal_uInt16 i_nPrefix,
924 : const OUString& i_rLocalName,
925 : XMLHints_Impl& i_rHints,
926 : bool & i_rIgnoreLeadingSpace )
927 : : XMLMetaImportContextBase( i_rImport, i_nPrefix, i_rLocalName,
928 21 : i_rHints, i_rIgnoreLeadingSpace )
929 : {
930 21 : }
931 :
932 24 : void XMLMetaFieldImportContext::ProcessAttribute(sal_uInt16 const i_nPrefix,
933 : OUString const & i_rLocalName, OUString const & i_rValue)
934 : {
935 28 : if ( XML_NAMESPACE_STYLE == i_nPrefix &&
936 4 : IsXMLToken( i_rLocalName, XML_DATA_STYLE_NAME ) )
937 : {
938 4 : m_DataStyleName = i_rValue;
939 : }
940 : else
941 : {
942 : XMLMetaImportContextBase::ProcessAttribute(
943 20 : i_nPrefix, i_rLocalName, i_rValue);
944 : }
945 24 : }
946 :
947 21 : void XMLMetaFieldImportContext::InsertMeta(
948 : const Reference<XTextRange> & i_xInsertionRange)
949 : {
950 21 : if (!m_XmlId.isEmpty()) // valid?
951 : {
952 : // insert mark
953 : const Reference<XPropertySet> xPropertySet(
954 : XMLTextMarkImportContext::CreateAndInsertMark(
955 20 : GetImport(),
956 : OUString("com.sun.star.text.textfield.MetadataField"),
957 : OUString(),
958 : i_xInsertionRange, m_XmlId),
959 40 : UNO_QUERY);
960 : SAL_WARN_IF(!xPropertySet.is(), "xmloff.text", "cannot insert MetaField?");
961 41 : if (!xPropertySet.is()) return;
962 :
963 20 : if (!m_DataStyleName.isEmpty())
964 : {
965 4 : bool isDefaultLanguage(true);
966 :
967 4 : const sal_Int32 nKey( GetImport().GetTextImport()->GetDataStyleKey(
968 8 : m_DataStyleName, & isDefaultLanguage) );
969 :
970 4 : if (-1 != nKey)
971 : {
972 : static OUString sPropertyIsFixedLanguage(
973 4 : OUString("IsFixedLanguage") );
974 4 : Any any;
975 4 : any <<= nKey;
976 4 : xPropertySet->setPropertyValue(
977 4 : OUString("NumberFormat"), any);
978 8 : if ( xPropertySet->getPropertySetInfo()->
979 4 : hasPropertyByName( sPropertyIsFixedLanguage ) )
980 : {
981 4 : any <<= static_cast<bool>(!isDefaultLanguage);
982 4 : xPropertySet->setPropertyValue( sPropertyIsFixedLanguage,
983 4 : any );
984 4 : }
985 : }
986 20 : }
987 : }
988 : else
989 : {
990 : SAL_INFO("xmloff.text", "invalid <text:meta-field>: no xml:id");
991 : }
992 : }
993 :
994 : /**
995 : * Process index marks.
996 : *
997 : * All *-mark-end index marks should instantiate *this* class (because
998 : * it doesn't process attributes other than ID), while the *-mark and
999 : * *-mark-start classes should instantiate the apporpiate subclasses.
1000 : */
1001 0 : class XMLIndexMarkImportContext_Impl : public SvXMLImportContext
1002 : {
1003 : const OUString sAlternativeText;
1004 :
1005 : XMLHints_Impl& rHints;
1006 : const enum XMLTextPElemTokens eToken;
1007 : OUString sID;
1008 :
1009 : public:
1010 : TYPEINFO_OVERRIDE();
1011 :
1012 : XMLIndexMarkImportContext_Impl(
1013 : SvXMLImport& rImport,
1014 : sal_uInt16 nPrefix,
1015 : const OUString& rLocalName,
1016 : enum XMLTextPElemTokens nTok,
1017 : XMLHints_Impl& rHnts);
1018 :
1019 : void StartElement(const Reference<xml::sax::XAttributeList> & xAttrList) SAL_OVERRIDE;
1020 :
1021 : protected:
1022 :
1023 : /// process all attributes
1024 : void ProcessAttributes(const Reference<xml::sax::XAttributeList> & xAttrList,
1025 : Reference<beans::XPropertySet>& rPropSet);
1026 :
1027 : /**
1028 : * All marks can be created immediately. Since we don't care about
1029 : * the element content, ProcessAttribute should set the properties
1030 : * immediately.
1031 : *
1032 : * This method tolerates an empty PropertySet; subclasses however
1033 : * are not expected to.
1034 : */
1035 : virtual void ProcessAttribute(sal_uInt16 nNamespace,
1036 : const OUString& sLocalName,
1037 : const OUString& sValue,
1038 : Reference<beans::XPropertySet>& rPropSet);
1039 :
1040 : static void GetServiceName(OUString& sServiceName,
1041 : enum XMLTextPElemTokens nToken);
1042 :
1043 : bool CreateMark(Reference<beans::XPropertySet>& rPropSet,
1044 : const OUString& rServiceName);
1045 : };
1046 :
1047 0 : TYPEINIT1( XMLIndexMarkImportContext_Impl, SvXMLImportContext );
1048 :
1049 0 : XMLIndexMarkImportContext_Impl::XMLIndexMarkImportContext_Impl(
1050 : SvXMLImport& rImport,
1051 : sal_uInt16 nPrefix,
1052 : const OUString& rLocalName,
1053 : enum XMLTextPElemTokens eTok,
1054 : XMLHints_Impl& rHnts) :
1055 : SvXMLImportContext(rImport, nPrefix, rLocalName),
1056 : sAlternativeText("AlternativeText"),
1057 : rHints(rHnts),
1058 0 : eToken(eTok)
1059 : {
1060 0 : }
1061 :
1062 0 : void XMLIndexMarkImportContext_Impl::StartElement(
1063 : const Reference<xml::sax::XAttributeList> & xAttrList)
1064 : {
1065 : // get Cursor position (needed for all cases)
1066 : Reference<XTextRange> xPos(
1067 0 : GetImport().GetTextImport()->GetCursor()->getStart());
1068 0 : Reference<beans::XPropertySet> xMark;
1069 :
1070 0 : switch (eToken)
1071 : {
1072 : case XML_TOK_TEXT_TOC_MARK:
1073 : case XML_TOK_TEXT_USER_INDEX_MARK:
1074 : case XML_TOK_TEXT_ALPHA_INDEX_MARK:
1075 : {
1076 : // single mark: create mark and insert
1077 0 : OUString sService;
1078 0 : GetServiceName(sService, eToken);
1079 0 : if (CreateMark(xMark, sService))
1080 : {
1081 0 : ProcessAttributes(xAttrList, xMark);
1082 0 : XMLHint_Impl* pHint = new XMLIndexMarkHint_Impl(xMark, xPos);
1083 0 : rHints.push_back(pHint);
1084 : }
1085 : // else: can't create mark -> ignore
1086 0 : break;
1087 : }
1088 :
1089 : case XML_TOK_TEXT_TOC_MARK_START:
1090 : case XML_TOK_TEXT_USER_INDEX_MARK_START:
1091 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
1092 : {
1093 : // start: create mark and insert (if ID is found)
1094 0 : OUString sService;
1095 0 : GetServiceName(sService, eToken);
1096 0 : if (CreateMark(xMark, sService))
1097 : {
1098 0 : ProcessAttributes(xAttrList, xMark);
1099 0 : if (!sID.isEmpty())
1100 : {
1101 : // process only if we find an ID
1102 : XMLHint_Impl* pHint =
1103 0 : new XMLIndexMarkHint_Impl(xMark, xPos, sID);
1104 0 : rHints.push_back(pHint);
1105 : }
1106 : // else: no ID -> we'll never find the end -> ignore
1107 : }
1108 : // else: can't create mark -> ignore
1109 0 : break;
1110 : }
1111 :
1112 : case XML_TOK_TEXT_TOC_MARK_END:
1113 : case XML_TOK_TEXT_USER_INDEX_MARK_END:
1114 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
1115 : {
1116 : // end: search for ID and set end of mark
1117 :
1118 : // call process attributes with empty XPropertySet:
1119 0 : ProcessAttributes(xAttrList, xMark);
1120 0 : if (!sID.isEmpty())
1121 : {
1122 : // if we have an ID, find the hint and set the end position
1123 0 : sal_uInt16 nCount = rHints.size();
1124 0 : for(sal_uInt16 nPos = 0; nPos < nCount; nPos++)
1125 : {
1126 0 : XMLHint_Impl *pHint = &rHints[nPos];
1127 0 : if ( pHint->IsIndexMark() &&
1128 : sID.equals(
1129 0 : static_cast<XMLIndexMarkHint_Impl *>(pHint)->GetID()) )
1130 : {
1131 : // set end and stop searching
1132 0 : pHint->SetEnd(xPos);
1133 0 : break;
1134 : }
1135 : }
1136 : }
1137 : // else: no ID -> ignore
1138 0 : break;
1139 : }
1140 :
1141 : default:
1142 : SAL_WARN("xmloff.text", "unknown index mark type!");
1143 0 : break;
1144 0 : }
1145 0 : }
1146 :
1147 0 : void XMLIndexMarkImportContext_Impl::ProcessAttributes(
1148 : const Reference<xml::sax::XAttributeList> & xAttrList,
1149 : Reference<beans::XPropertySet>& rPropSet)
1150 : {
1151 : // process attributes
1152 0 : sal_Int16 nLength = xAttrList->getLength();
1153 0 : for(sal_Int16 i=0; i<nLength; i++)
1154 : {
1155 0 : OUString sLocalName;
1156 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
1157 0 : GetKeyByAttrName( xAttrList->getNameByIndex(i), &sLocalName );
1158 :
1159 : ProcessAttribute(nPrefix, sLocalName,
1160 0 : xAttrList->getValueByIndex(i),
1161 0 : rPropSet);
1162 0 : }
1163 0 : }
1164 :
1165 0 : void XMLIndexMarkImportContext_Impl::ProcessAttribute(
1166 : sal_uInt16 nNamespace,
1167 : const OUString& sLocalName,
1168 : const OUString& sValue,
1169 : Reference<beans::XPropertySet>& rPropSet)
1170 : {
1171 : // we only know ID + string-value attribute;
1172 : // (former: marks, latter: -start + -end-marks)
1173 : // the remainder is handled in sub-classes
1174 0 : switch (eToken)
1175 : {
1176 : case XML_TOK_TEXT_TOC_MARK:
1177 : case XML_TOK_TEXT_USER_INDEX_MARK:
1178 : case XML_TOK_TEXT_ALPHA_INDEX_MARK:
1179 0 : if ( (XML_NAMESPACE_TEXT == nNamespace) &&
1180 0 : IsXMLToken( sLocalName, XML_STRING_VALUE ) )
1181 : {
1182 0 : rPropSet->setPropertyValue(sAlternativeText, uno::makeAny(sValue));
1183 : }
1184 : // else: ignore!
1185 0 : break;
1186 :
1187 : case XML_TOK_TEXT_TOC_MARK_START:
1188 : case XML_TOK_TEXT_USER_INDEX_MARK_START:
1189 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
1190 : case XML_TOK_TEXT_TOC_MARK_END:
1191 : case XML_TOK_TEXT_USER_INDEX_MARK_END:
1192 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
1193 0 : if ( (XML_NAMESPACE_TEXT == nNamespace) &&
1194 0 : IsXMLToken( sLocalName, XML_ID ) )
1195 : {
1196 0 : sID = sValue;
1197 : }
1198 : // else: ignore
1199 0 : break;
1200 :
1201 : default:
1202 : SAL_WARN("xmloff.text", "unknown index mark type!");
1203 0 : break;
1204 : }
1205 0 : }
1206 :
1207 : static const sal_Char sAPI_com_sun_star_text_ContentIndexMark[] =
1208 : "com.sun.star.text.ContentIndexMark";
1209 : static const sal_Char sAPI_com_sun_star_text_UserIndexMark[] =
1210 : "com.sun.star.text.UserIndexMark";
1211 : static const sal_Char sAPI_com_sun_star_text_DocumentIndexMark[] =
1212 : "com.sun.star.text.DocumentIndexMark";
1213 :
1214 0 : void XMLIndexMarkImportContext_Impl::GetServiceName(
1215 : OUString& sServiceName,
1216 : enum XMLTextPElemTokens eToken)
1217 : {
1218 0 : switch (eToken)
1219 : {
1220 : case XML_TOK_TEXT_TOC_MARK:
1221 : case XML_TOK_TEXT_TOC_MARK_START:
1222 : case XML_TOK_TEXT_TOC_MARK_END:
1223 : {
1224 : OUString sTmp(
1225 0 : sAPI_com_sun_star_text_ContentIndexMark);
1226 0 : sServiceName = sTmp;
1227 0 : break;
1228 : }
1229 :
1230 : case XML_TOK_TEXT_USER_INDEX_MARK:
1231 : case XML_TOK_TEXT_USER_INDEX_MARK_START:
1232 : case XML_TOK_TEXT_USER_INDEX_MARK_END:
1233 : {
1234 : OUString sTmp(
1235 0 : sAPI_com_sun_star_text_UserIndexMark);
1236 0 : sServiceName = sTmp;
1237 0 : break;
1238 : }
1239 :
1240 : case XML_TOK_TEXT_ALPHA_INDEX_MARK:
1241 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
1242 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
1243 : {
1244 : OUString sTmp(
1245 0 : sAPI_com_sun_star_text_DocumentIndexMark);
1246 0 : sServiceName = sTmp;
1247 0 : break;
1248 : }
1249 :
1250 : default:
1251 : {
1252 : SAL_WARN("xmloff.text", "unknown index mark type!");
1253 0 : OUString sTmp;
1254 0 : sServiceName = sTmp;
1255 0 : break;
1256 : }
1257 : }
1258 0 : }
1259 :
1260 0 : bool XMLIndexMarkImportContext_Impl::CreateMark(
1261 : Reference<beans::XPropertySet>& rPropSet,
1262 : const OUString& rServiceName)
1263 : {
1264 : Reference<lang::XMultiServiceFactory>
1265 0 : xFactory(GetImport().GetModel(), UNO_QUERY);
1266 :
1267 0 : if( xFactory.is() )
1268 : {
1269 0 : Reference<beans::XPropertySet> xPropSet( xFactory->createInstance(rServiceName), UNO_QUERY );
1270 0 : if (xPropSet.is())
1271 0 : rPropSet = xPropSet;
1272 0 : return true;
1273 : }
1274 :
1275 0 : return false;
1276 : }
1277 :
1278 0 : class XMLTOCMarkImportContext_Impl : public XMLIndexMarkImportContext_Impl
1279 : {
1280 : const OUString sLevel;
1281 :
1282 : public:
1283 : TYPEINFO_OVERRIDE();
1284 :
1285 : XMLTOCMarkImportContext_Impl(
1286 : SvXMLImport& rImport,
1287 : sal_uInt16 nPrefix,
1288 : const OUString& rLocalName,
1289 : enum XMLTextPElemTokens nTok,
1290 : XMLHints_Impl& rHnts);
1291 :
1292 : protected:
1293 :
1294 : /** process outline level */
1295 : virtual void ProcessAttribute(sal_uInt16 nNamespace,
1296 : const OUString& sLocalName,
1297 : const OUString& sValue,
1298 : Reference<beans::XPropertySet>& rPropSet) SAL_OVERRIDE;
1299 : };
1300 :
1301 0 : TYPEINIT1( XMLTOCMarkImportContext_Impl, XMLIndexMarkImportContext_Impl );
1302 :
1303 0 : XMLTOCMarkImportContext_Impl::XMLTOCMarkImportContext_Impl(
1304 : SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName,
1305 : enum XMLTextPElemTokens nTok, XMLHints_Impl& rHnts) :
1306 : XMLIndexMarkImportContext_Impl(rImport, nPrefix, rLocalName,
1307 : nTok, rHnts),
1308 0 : sLevel("Level")
1309 : {
1310 0 : }
1311 :
1312 0 : void XMLTOCMarkImportContext_Impl::ProcessAttribute(
1313 : sal_uInt16 nNamespace,
1314 : const OUString& sLocalName,
1315 : const OUString& sValue,
1316 : Reference<beans::XPropertySet>& rPropSet)
1317 : {
1318 : SAL_WARN_IF(!rPropSet.is(), "xmloff.text", "need PropertySet");
1319 :
1320 0 : if ((XML_NAMESPACE_TEXT == nNamespace) &&
1321 0 : IsXMLToken( sLocalName, XML_OUTLINE_LEVEL ) )
1322 : {
1323 : // ouline level: set Level property
1324 : sal_Int32 nTmp;
1325 0 : if (::sax::Converter::convertNumber( nTmp, sValue )
1326 0 : && nTmp >= 1
1327 0 : && nTmp < GetImport().GetTextImport()->
1328 0 : GetChapterNumbering()->getCount() )
1329 : {
1330 0 : rPropSet->setPropertyValue(sLevel, uno::makeAny((sal_Int16)(nTmp - 1)));
1331 : }
1332 : // else: value out of range -> ignore
1333 : }
1334 : else
1335 : {
1336 : // else: delegate to superclass
1337 : XMLIndexMarkImportContext_Impl::ProcessAttribute(
1338 0 : nNamespace, sLocalName, sValue, rPropSet);
1339 : }
1340 0 : }
1341 :
1342 0 : class XMLUserIndexMarkImportContext_Impl : public XMLIndexMarkImportContext_Impl
1343 : {
1344 : const OUString sUserIndexName;
1345 : const OUString sLevel;
1346 :
1347 : public:
1348 : TYPEINFO_OVERRIDE();
1349 :
1350 : XMLUserIndexMarkImportContext_Impl(
1351 : SvXMLImport& rImport,
1352 : sal_uInt16 nPrefix,
1353 : const OUString& rLocalName,
1354 : enum XMLTextPElemTokens nTok,
1355 : XMLHints_Impl& rHnts);
1356 :
1357 : protected:
1358 :
1359 : /** process index name */
1360 : virtual void ProcessAttribute(sal_uInt16 nNamespace,
1361 : const OUString& sLocalName,
1362 : const OUString& sValue,
1363 : Reference<beans::XPropertySet>& rPropSet) SAL_OVERRIDE;
1364 : };
1365 :
1366 0 : TYPEINIT1( XMLUserIndexMarkImportContext_Impl, XMLIndexMarkImportContext_Impl);
1367 :
1368 0 : XMLUserIndexMarkImportContext_Impl::XMLUserIndexMarkImportContext_Impl(
1369 : SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName,
1370 : enum XMLTextPElemTokens nTok, XMLHints_Impl& rHnts) :
1371 : XMLIndexMarkImportContext_Impl(rImport, nPrefix, rLocalName,
1372 : nTok, rHnts),
1373 : sUserIndexName("UserIndexName"),
1374 0 : sLevel("Level")
1375 : {
1376 0 : }
1377 :
1378 0 : void XMLUserIndexMarkImportContext_Impl::ProcessAttribute(
1379 : sal_uInt16 nNamespace, const OUString& sLocalName, const OUString& sValue,
1380 : Reference<beans::XPropertySet>& rPropSet)
1381 : {
1382 0 : if ( XML_NAMESPACE_TEXT == nNamespace )
1383 : {
1384 0 : if ( IsXMLToken( sLocalName, XML_INDEX_NAME ) )
1385 : {
1386 0 : rPropSet->setPropertyValue(sUserIndexName, uno::makeAny(sValue));
1387 : }
1388 0 : else if ( IsXMLToken( sLocalName, XML_OUTLINE_LEVEL ) )
1389 : {
1390 : // ouline level: set Level property
1391 : sal_Int32 nTmp;
1392 0 : if (::sax::Converter::convertNumber(
1393 : nTmp, sValue, 0,
1394 0 : GetImport().GetTextImport()->GetChapterNumbering()->getCount()))
1395 : {
1396 0 : rPropSet->setPropertyValue(sLevel, uno::makeAny(static_cast<sal_Int16>(nTmp - 1)));
1397 : }
1398 : // else: value out of range -> ignore
1399 : }
1400 : else
1401 : {
1402 : // else: unknown text property: delegate to super class
1403 : XMLIndexMarkImportContext_Impl::ProcessAttribute(
1404 0 : nNamespace, sLocalName, sValue, rPropSet);
1405 : }
1406 : }
1407 : else
1408 : {
1409 : // else: unknown namespace: delegate to super class
1410 : XMLIndexMarkImportContext_Impl::ProcessAttribute(
1411 0 : nNamespace, sLocalName, sValue, rPropSet);
1412 : }
1413 0 : }
1414 :
1415 0 : class XMLAlphaIndexMarkImportContext_Impl : public XMLIndexMarkImportContext_Impl
1416 : {
1417 : const OUString sPrimaryKey;
1418 : const OUString sSecondaryKey;
1419 : const OUString sTextReading;
1420 : const OUString sPrimaryKeyReading;
1421 : const OUString sSecondaryKeyReading;
1422 : const OUString sMainEntry;
1423 :
1424 : public:
1425 : TYPEINFO_OVERRIDE();
1426 :
1427 : XMLAlphaIndexMarkImportContext_Impl(
1428 : SvXMLImport& rImport,
1429 : sal_uInt16 nPrefix,
1430 : const OUString& rLocalName,
1431 : enum XMLTextPElemTokens nTok,
1432 : XMLHints_Impl& rHnts);
1433 :
1434 : protected:
1435 :
1436 : /** process primary + secondary keys */
1437 : virtual void ProcessAttribute(sal_uInt16 nNamespace,
1438 : const OUString& sLocalName,
1439 : const OUString& sValue,
1440 : Reference<beans::XPropertySet>& rPropSet) SAL_OVERRIDE;
1441 : };
1442 :
1443 0 : TYPEINIT1( XMLAlphaIndexMarkImportContext_Impl,
1444 : XMLIndexMarkImportContext_Impl );
1445 :
1446 0 : XMLAlphaIndexMarkImportContext_Impl::XMLAlphaIndexMarkImportContext_Impl(
1447 : SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName,
1448 : enum XMLTextPElemTokens nTok, XMLHints_Impl& rHnts) :
1449 : XMLIndexMarkImportContext_Impl(rImport, nPrefix, rLocalName,
1450 : nTok, rHnts),
1451 : sPrimaryKey("PrimaryKey"),
1452 : sSecondaryKey("SecondaryKey"),
1453 : sTextReading("TextReading"),
1454 : sPrimaryKeyReading("PrimaryKeyReading"),
1455 : sSecondaryKeyReading("SecondaryKeyReading"),
1456 0 : sMainEntry("IsMainEntry")
1457 : {
1458 0 : }
1459 :
1460 0 : void XMLAlphaIndexMarkImportContext_Impl::ProcessAttribute(
1461 : sal_uInt16 nNamespace, const OUString& sLocalName, const OUString& sValue,
1462 : Reference<beans::XPropertySet>& rPropSet)
1463 : {
1464 0 : if (XML_NAMESPACE_TEXT == nNamespace)
1465 : {
1466 0 : if ( IsXMLToken( sLocalName, XML_KEY1 ) )
1467 : {
1468 0 : rPropSet->setPropertyValue(sPrimaryKey, uno::makeAny(sValue));
1469 : }
1470 0 : else if ( IsXMLToken( sLocalName, XML_KEY2 ) )
1471 : {
1472 0 : rPropSet->setPropertyValue(sSecondaryKey, uno::makeAny(sValue));
1473 : }
1474 0 : else if ( IsXMLToken( sLocalName, XML_KEY1_PHONETIC ) )
1475 : {
1476 0 : rPropSet->setPropertyValue(sPrimaryKeyReading, uno::makeAny(sValue));
1477 : }
1478 0 : else if ( IsXMLToken( sLocalName, XML_KEY2_PHONETIC ) )
1479 : {
1480 0 : rPropSet->setPropertyValue(sSecondaryKeyReading, uno::makeAny(sValue));
1481 : }
1482 0 : else if ( IsXMLToken( sLocalName, XML_STRING_VALUE_PHONETIC ) )
1483 : {
1484 0 : rPropSet->setPropertyValue(sTextReading, uno::makeAny(sValue));
1485 : }
1486 0 : else if ( IsXMLToken( sLocalName, XML_MAIN_ENTRY ) )
1487 : {
1488 0 : bool bMainEntry = false;
1489 0 : bool bTmp(false);
1490 :
1491 0 : if (::sax::Converter::convertBool(bTmp, sValue))
1492 0 : bMainEntry = bTmp;
1493 :
1494 0 : rPropSet->setPropertyValue(sMainEntry, uno::makeAny(bMainEntry));
1495 : }
1496 : else
1497 : {
1498 : XMLIndexMarkImportContext_Impl::ProcessAttribute(
1499 0 : nNamespace, sLocalName, sValue, rPropSet);
1500 : }
1501 : }
1502 : else
1503 : {
1504 : XMLIndexMarkImportContext_Impl::ProcessAttribute(
1505 0 : nNamespace, sLocalName, sValue, rPropSet);
1506 : }
1507 0 : }
1508 :
1509 0 : TYPEINIT1( XMLImpSpanContext_Impl, SvXMLImportContext );
1510 :
1511 6026 : XMLImpSpanContext_Impl::XMLImpSpanContext_Impl(
1512 : SvXMLImport& rImport,
1513 : sal_uInt16 nPrfx,
1514 : const OUString& rLName,
1515 : const Reference< xml::sax::XAttributeList > & xAttrList,
1516 : XMLHints_Impl& rHnts,
1517 : bool& rIgnLeadSpace,
1518 : sal_uInt8 nSFConvFlags
1519 : )
1520 : : SvXMLImportContext( rImport, nPrfx, rLName )
1521 : , rHints( rHnts )
1522 : , pHint( 0 )
1523 : , rIgnoreLeadingSpace( rIgnLeadSpace )
1524 6026 : , nStarFontsConvFlags( nSFConvFlags & (CONV_FROM_STAR_BATS|CONV_FROM_STAR_MATH) )
1525 : {
1526 6026 : OUString aStyleName;
1527 :
1528 6026 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1529 11891 : for( sal_Int16 i=0; i < nAttrCount; i++ )
1530 : {
1531 5865 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
1532 :
1533 11730 : OUString aLocalName;
1534 : sal_uInt16 nPrefix =
1535 5865 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
1536 5865 : &aLocalName );
1537 11730 : if( XML_NAMESPACE_TEXT == nPrefix &&
1538 5865 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
1539 5865 : aStyleName = xAttrList->getValueByIndex( i );
1540 5865 : }
1541 :
1542 6026 : if( !aStyleName.isEmpty() )
1543 : {
1544 : pHint = new XMLStyleHint_Impl( aStyleName,
1545 5865 : GetImport().GetTextImport()->GetCursorAsRange()->getStart() );
1546 5865 : rHints.push_back( pHint );
1547 6026 : }
1548 6026 : }
1549 :
1550 18078 : XMLImpSpanContext_Impl::~XMLImpSpanContext_Impl()
1551 : {
1552 6026 : if( pHint )
1553 5865 : pHint->SetEnd( GetImport().GetTextImport()
1554 5865 : ->GetCursorAsRange()->getStart() );
1555 12052 : }
1556 :
1557 17079 : SvXMLImportContext *XMLImpSpanContext_Impl::CreateChildContext(
1558 : SvXMLImport& rImport,
1559 : sal_uInt16 nPrefix, const OUString& rLocalName,
1560 : const Reference< xml::sax::XAttributeList > & xAttrList,
1561 : sal_uInt16 nToken,
1562 : XMLHints_Impl& rHints,
1563 : bool& rIgnoreLeadingSpace,
1564 : sal_uInt8 nStarFontsConvFlags
1565 : )
1566 : {
1567 17079 : SvXMLImportContext *pContext = 0;
1568 :
1569 17079 : switch( nToken )
1570 : {
1571 : case XML_TOK_TEXT_SPAN:
1572 : pContext = new XMLImpSpanContext_Impl( rImport, nPrefix,
1573 : rLocalName, xAttrList,
1574 : rHints,
1575 : rIgnoreLeadingSpace
1576 : ,nStarFontsConvFlags
1577 6026 : );
1578 6026 : break;
1579 :
1580 : case XML_TOK_TEXT_TAB_STOP:
1581 : pContext = new XMLCharContext( rImport, nPrefix,
1582 : rLocalName, xAttrList,
1583 1364 : 0x0009, false );
1584 1364 : rIgnoreLeadingSpace = false;
1585 1364 : break;
1586 :
1587 : case XML_TOK_TEXT_LINE_BREAK:
1588 : pContext = new XMLCharContext( rImport, nPrefix,
1589 : rLocalName, xAttrList,
1590 562 : ControlCharacter::LINE_BREAK );
1591 562 : rIgnoreLeadingSpace = false;
1592 562 : break;
1593 :
1594 : case XML_TOK_TEXT_S:
1595 : pContext = new XMLCharContext( rImport, nPrefix,
1596 : rLocalName, xAttrList,
1597 4383 : 0x0020, true );
1598 4383 : break;
1599 :
1600 : case XML_TOK_TEXT_HYPERLINK:
1601 : {
1602 : // test for HyperLinkURL property. If present, insert link as
1603 : // text property (StarWriter), else try to insert as text
1604 : // field (StarCalc, StarDraw, ...)
1605 65 : Reference< beans::XPropertySet > xPropSet( rImport.GetTextImport()->GetCursor(), UNO_QUERY );
1606 :
1607 130 : const OUString sHyperLinkURL("HyperLinkURL");
1608 :
1609 65 : if ( xPropSet->getPropertySetInfo()->hasPropertyByName( sHyperLinkURL ) )
1610 : {
1611 : pContext = new XMLImpHyperlinkContext_Impl(
1612 : rImport,
1613 : nPrefix,
1614 : rLocalName,
1615 : xAttrList,
1616 : rHints,
1617 64 : rIgnoreLeadingSpace );
1618 : }
1619 : else
1620 : {
1621 1 : pContext = new XMLUrlFieldImportContext( rImport, *rImport.GetTextImport().get(), nPrefix, rLocalName );
1622 : //whitespace handling like other fields
1623 1 : rIgnoreLeadingSpace = false;
1624 :
1625 : }
1626 130 : break;
1627 : }
1628 :
1629 : case XML_TOK_TEXT_RUBY:
1630 : pContext = new XMLImpRubyContext_Impl( rImport, nPrefix,
1631 : rLocalName, xAttrList,
1632 : rHints,
1633 12 : rIgnoreLeadingSpace );
1634 12 : break;
1635 :
1636 : case XML_TOK_TEXT_NOTE:
1637 23 : if (rImport.GetTextImport()->IsInFrame())
1638 : {
1639 : // we must not insert footnotes into text frames
1640 : pContext = new SvXMLImportContext( rImport, nPrefix,
1641 0 : rLocalName );
1642 : }
1643 : else
1644 : {
1645 : pContext = new XMLFootnoteImportContext( rImport,
1646 46 : *rImport.GetTextImport().get(),
1647 23 : nPrefix, rLocalName );
1648 : }
1649 23 : rIgnoreLeadingSpace = false;
1650 23 : break;
1651 :
1652 : case XML_TOK_TEXT_REFERENCE:
1653 : case XML_TOK_TEXT_BOOKMARK:
1654 : case XML_TOK_TEXT_BOOKMARK_START:
1655 : case XML_TOK_TEXT_BOOKMARK_END:
1656 : pContext = new XMLTextMarkImportContext( rImport,
1657 4028 : *rImport.GetTextImport().get(),
1658 2014 : nPrefix, rLocalName );
1659 2014 : break;
1660 :
1661 : case XML_TOK_TEXT_FIELDMARK:
1662 : case XML_TOK_TEXT_FIELDMARK_START:
1663 : case XML_TOK_TEXT_FIELDMARK_END:
1664 : pContext = new XMLTextMarkImportContext( rImport,
1665 4 : *rImport.GetTextImport().get(),
1666 2 : nPrefix, rLocalName );
1667 2 : break;
1668 :
1669 : case XML_TOK_TEXT_REFERENCE_START:
1670 : pContext = new XMLStartReferenceContext_Impl( rImport,
1671 : nPrefix, rLocalName,
1672 0 : rHints, xAttrList );
1673 0 : break;
1674 :
1675 : case XML_TOK_TEXT_REFERENCE_END:
1676 : pContext = new XMLEndReferenceContext_Impl( rImport,
1677 : nPrefix, rLocalName,
1678 0 : rHints, xAttrList );
1679 0 : break;
1680 :
1681 : case XML_TOK_TEXT_FRAME:
1682 : {
1683 : Reference < XTextRange > xAnchorPos =
1684 274 : rImport.GetTextImport()->GetCursor()->getStart();
1685 : XMLTextFrameContext *pTextFrameContext =
1686 : new XMLTextFrameContext( rImport, nPrefix,
1687 : rLocalName, xAttrList,
1688 274 : TextContentAnchorType_AS_CHARACTER );
1689 : // Remove check for text content. (#i33242#)
1690 : // Check for text content is done on the processing of the hint
1691 274 : if( TextContentAnchorType_AT_CHARACTER ==
1692 274 : pTextFrameContext->GetAnchorType() )
1693 : {
1694 : rHints.push_back( new XMLTextFrameHint_Impl(
1695 10 : pTextFrameContext, xAnchorPos ) );
1696 : }
1697 274 : pContext = pTextFrameContext;
1698 274 : rIgnoreLeadingSpace = false;
1699 : }
1700 274 : break;
1701 : case XML_TOK_DRAW_A:
1702 : {
1703 2 : Reference < XTextRange > xAnchorPos(rImport.GetTextImport()->GetCursor()->getStart());
1704 : pContext =
1705 : new XMLTextFrameHyperlinkContext( rImport, nPrefix,
1706 : rLocalName, xAttrList,
1707 2 : TextContentAnchorType_AS_CHARACTER );
1708 : XMLTextFrameHint_Impl *pHint =
1709 2 : new XMLTextFrameHint_Impl( pContext, xAnchorPos);
1710 2 : rHints.push_back( pHint );
1711 : }
1712 2 : break;
1713 :
1714 : case XML_TOK_TEXT_TOC_MARK:
1715 : case XML_TOK_TEXT_TOC_MARK_START:
1716 : pContext = new XMLTOCMarkImportContext_Impl(
1717 : rImport, nPrefix, rLocalName,
1718 0 : (enum XMLTextPElemTokens)nToken, rHints);
1719 0 : break;
1720 :
1721 : case XML_TOK_TEXT_USER_INDEX_MARK:
1722 : case XML_TOK_TEXT_USER_INDEX_MARK_START:
1723 : pContext = new XMLUserIndexMarkImportContext_Impl(
1724 : rImport, nPrefix, rLocalName,
1725 0 : (enum XMLTextPElemTokens)nToken, rHints);
1726 0 : break;
1727 :
1728 : case XML_TOK_TEXT_ALPHA_INDEX_MARK:
1729 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
1730 : pContext = new XMLAlphaIndexMarkImportContext_Impl(
1731 : rImport, nPrefix, rLocalName,
1732 0 : (enum XMLTextPElemTokens)nToken, rHints);
1733 0 : break;
1734 :
1735 : case XML_TOK_TEXT_TOC_MARK_END:
1736 : case XML_TOK_TEXT_USER_INDEX_MARK_END:
1737 : case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
1738 : pContext = new XMLIndexMarkImportContext_Impl(
1739 : rImport, nPrefix, rLocalName, (enum XMLTextPElemTokens)nToken,
1740 0 : rHints);
1741 0 : break;
1742 :
1743 : case XML_TOK_TEXTP_CHANGE_START:
1744 : case XML_TOK_TEXTP_CHANGE_END:
1745 : case XML_TOK_TEXTP_CHANGE:
1746 : pContext = new XMLChangeImportContext(
1747 : rImport, nPrefix, rLocalName,
1748 : (nToken != XML_TOK_TEXTP_CHANGE_END),
1749 : (nToken != XML_TOK_TEXTP_CHANGE_START),
1750 62 : false);
1751 62 : break;
1752 :
1753 : case XML_TOK_TEXT_META:
1754 : pContext = new XMLMetaImportContext(rImport, nPrefix, rLocalName,
1755 19 : rHints, rIgnoreLeadingSpace );
1756 19 : break;
1757 :
1758 : case XML_TOK_TEXT_META_FIELD:
1759 : pContext = new XMLMetaFieldImportContext(rImport, nPrefix, rLocalName,
1760 21 : rHints, rIgnoreLeadingSpace );
1761 21 : break;
1762 :
1763 : default:
1764 : // none of the above? then it's probably a text field!
1765 : pContext =
1766 : XMLTextFieldImportContext::CreateTextFieldImportContext(
1767 4500 : rImport, *rImport.GetTextImport().get(), nPrefix, rLocalName,
1768 4500 : nToken);
1769 : // #108784# import draw elements (except control shapes in headers)
1770 6936 : if( pContext == NULL &&
1771 2532 : !( rImport.GetTextImport()->IsInHeaderFooter() &&
1772 : nPrefix == XML_NAMESPACE_DRAW &&
1773 3 : IsXMLToken( rLocalName, XML_CONTROL ) ) )
1774 : {
1775 93 : Reference < XShapes > xShapes;
1776 : SvXMLShapeContext* pShapeContext = rImport.GetShapeImport()->CreateGroupChildContext(
1777 93 : rImport, nPrefix, rLocalName, xAttrList, xShapes );
1778 93 : pContext = pShapeContext;
1779 : // OD 2004-04-20 #i26791# - keep shape in a text frame hint to
1780 : // adjust its anchor position, if its at-character anchored
1781 : Reference < XTextRange > xAnchorPos =
1782 186 : rImport.GetTextImport()->GetCursor()->getStart();
1783 186 : rHints.push_back( new XMLDrawHint_Impl( pShapeContext, xAnchorPos ) );
1784 : }
1785 2250 : if( !pContext )
1786 : {
1787 : // ignore unknown content
1788 : pContext =
1789 0 : new SvXMLImportContext( rImport, nPrefix, rLocalName );
1790 : }
1791 : // Behind fields, shapes and any unknown content blanks aren't ignored
1792 2250 : rIgnoreLeadingSpace = false;
1793 : }
1794 :
1795 17079 : return pContext;
1796 : }
1797 :
1798 6413 : SvXMLImportContext *XMLImpSpanContext_Impl::CreateChildContext(
1799 : sal_uInt16 nPrefix, const OUString& rLocalName,
1800 : const Reference< xml::sax::XAttributeList > & xAttrList )
1801 : {
1802 : const SvXMLTokenMap& rTokenMap =
1803 6413 : GetImport().GetTextImport()->GetTextPElemTokenMap();
1804 6413 : sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
1805 :
1806 6413 : return CreateChildContext( GetImport(), nPrefix, rLocalName, xAttrList,
1807 : nToken, rHints, rIgnoreLeadingSpace
1808 : ,nStarFontsConvFlags
1809 12826 : );
1810 : }
1811 :
1812 25841 : void XMLImpSpanContext_Impl::Characters( const OUString& rChars )
1813 : {
1814 25841 : OUString sStyleName;
1815 25841 : if( pHint )
1816 25841 : sStyleName = pHint->GetStyleName();
1817 : OUString sChars =
1818 25841 : GetImport().GetTextImport()->ConvertStarFonts( rChars, sStyleName,
1819 : nStarFontsConvFlags,
1820 77523 : false, GetImport() );
1821 51682 : GetImport().GetTextImport()->InsertString( sChars, rIgnoreLeadingSpace );
1822 25841 : }
1823 :
1824 0 : TYPEINIT1( XMLParaContext, SvXMLImportContext );
1825 :
1826 7600 : XMLParaContext::XMLParaContext(
1827 : SvXMLImport& rImport,
1828 : sal_uInt16 nPrfx,
1829 : const OUString& rLName,
1830 : const Reference< xml::sax::XAttributeList > & xAttrList,
1831 : bool bHead ) :
1832 : SvXMLImportContext( rImport, nPrfx, rLName ),
1833 15200 : xStart( rImport.GetTextImport()->GetCursorAsRange()->getStart() ),
1834 : m_bHaveAbout(false),
1835 7600 : nOutlineLevel( IsXMLToken( rLName, XML_H ) ? 1 : -1 ),
1836 : pHints( 0 ),
1837 : // Lost outline numbering in master document (#i73509#)
1838 : mbOutlineLevelAttrFound( false ),
1839 : bIgnoreLeadingSpace( true ),
1840 : bHeading( bHead ),
1841 : bIsListHeader( false ),
1842 : bIsRestart (false),
1843 : nStartValue(0),
1844 30400 : nStarFontsConvFlags( 0 )
1845 : {
1846 : const SvXMLTokenMap& rTokenMap =
1847 7600 : GetImport().GetTextImport()->GetTextPAttrTokenMap();
1848 :
1849 7600 : bool bHaveXmlId( false );
1850 15200 : OUString aCondStyleName, sClassNames;
1851 :
1852 7600 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1853 13947 : for( sal_Int16 i=0; i < nAttrCount; i++ )
1854 : {
1855 6347 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
1856 12694 : const OUString& rValue = xAttrList->getValueByIndex( i );
1857 :
1858 12694 : OUString aLocalName;
1859 : sal_uInt16 nPrefix =
1860 6347 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
1861 6347 : &aLocalName );
1862 6347 : switch( rTokenMap.Get( nPrefix, aLocalName ) )
1863 : {
1864 : case XML_TOK_TEXT_P_XMLID:
1865 15 : m_sXmlId = rValue;
1866 15 : bHaveXmlId = true;
1867 15 : break;
1868 : case XML_TOK_TEXT_P_ABOUT:
1869 34 : m_sAbout = rValue;
1870 34 : m_bHaveAbout = true;
1871 34 : break;
1872 : case XML_TOK_TEXT_P_PROPERTY:
1873 34 : m_sProperty = rValue;
1874 34 : break;
1875 : case XML_TOK_TEXT_P_CONTENT:
1876 10 : m_sContent = rValue;
1877 10 : break;
1878 : case XML_TOK_TEXT_P_DATATYPE:
1879 7 : m_sDatatype = rValue;
1880 7 : break;
1881 : case XML_TOK_TEXT_P_TEXTID:
1882 0 : if (!bHaveXmlId) { m_sXmlId = rValue; }
1883 0 : break;
1884 : case XML_TOK_TEXT_P_STYLE_NAME:
1885 6133 : sStyleName = rValue;
1886 6133 : break;
1887 : case XML_TOK_TEXT_P_CLASS_NAMES:
1888 0 : sClassNames = rValue;
1889 0 : break;
1890 : case XML_TOK_TEXT_P_COND_STYLE_NAME:
1891 0 : aCondStyleName = rValue;
1892 0 : break;
1893 : case XML_TOK_TEXT_P_LEVEL:
1894 : {
1895 79 : sal_Int32 nTmp = rValue.toInt32();
1896 79 : if( nTmp > 0L )
1897 : {
1898 79 : if( nTmp > 127 )
1899 0 : nTmp = 127;
1900 79 : nOutlineLevel = (sal_Int8)nTmp;
1901 : }
1902 : // Lost outline numbering in master document (#i73509#)
1903 79 : mbOutlineLevelAttrFound = true;
1904 : }
1905 79 : break;
1906 : case XML_TOK_TEXT_P_IS_LIST_HEADER:
1907 : {
1908 0 : bool bBool(false);
1909 0 : if( ::sax::Converter::convertBool( bBool, rValue ) )
1910 : {
1911 0 : bIsListHeader = bBool;
1912 : }
1913 : }
1914 0 : break;
1915 : case XML_TOK_TEXT_P_RESTART_NUMBERING:
1916 : {
1917 1 : bool bBool(false);
1918 1 : if (::sax::Converter::convertBool(bBool, rValue))
1919 : {
1920 1 : bIsRestart = bBool;
1921 : }
1922 : }
1923 1 : break;
1924 : case XML_TOK_TEXT_P_START_VALUE:
1925 : {
1926 : nStartValue = sal::static_int_cast< sal_Int16 >(
1927 1 : rValue.toInt32());
1928 : }
1929 1 : break;
1930 : }
1931 6347 : }
1932 :
1933 7600 : if( !aCondStyleName.isEmpty() )
1934 0 : sStyleName = aCondStyleName;
1935 7600 : else if( !sClassNames.isEmpty() )
1936 : {
1937 0 : sal_Int32 nDummy = 0;
1938 0 : sStyleName = sClassNames.getToken( 0, ' ', nDummy );
1939 7600 : }
1940 7600 : }
1941 :
1942 22800 : XMLParaContext::~XMLParaContext()
1943 : {
1944 : rtl::Reference < XMLTextImportHelper > xTxtImport(
1945 7600 : GetImport().GetTextImport());
1946 15200 : Reference < XTextRange > xCrsrRange( xTxtImport->GetCursorAsRange() );
1947 7600 : if( !xCrsrRange.is() )
1948 0 : return; // Robust (defect file)
1949 15200 : Reference < XTextRange > xEnd(xCrsrRange->getStart());
1950 :
1951 : // if we have an id set for this paragraph, get a cursor for this
1952 : // paragraph and register it with the given identifier
1953 : // FIXME: this is just temporary, and should be removed when
1954 : // EditEngine paragraphs implement XMetadatable!
1955 7600 : if (!m_sXmlId.isEmpty())
1956 : {
1957 15 : Reference < XTextCursor > xIdCursor( xTxtImport->GetText()->createTextCursorByRange( xStart ) );
1958 15 : if( xIdCursor.is() )
1959 : {
1960 15 : xIdCursor->gotoRange( xEnd, sal_True );
1961 15 : GetImport().getInterfaceToIdentifierMapper().registerReference(
1962 30 : m_sXmlId, Reference<XInterface>( xIdCursor, UNO_QUERY ));
1963 15 : }
1964 : }
1965 :
1966 : // insert a paragraph break
1967 7600 : xTxtImport->InsertControlCharacter( ControlCharacter::APPEND_PARAGRAPH );
1968 :
1969 : // create a cursor that select the whole last paragraph
1970 15200 : Reference < XTextCursor > xAttrCursor;
1971 : try {
1972 7600 : xAttrCursor = xTxtImport->GetText()->createTextCursorByRange( xStart );
1973 7600 : if( !xAttrCursor.is() )
1974 0 : return; // Robust (defect file)
1975 0 : } catch (const uno::Exception &) {
1976 : // createTextCursorByRange() likes to throw runtime exception, even
1977 : // though it just means 'we were unable to create the cursor'
1978 0 : return;
1979 : }
1980 7600 : xAttrCursor->gotoRange( xEnd, sal_True );
1981 :
1982 : // xml:id for RDF metadata
1983 7600 : if (!m_sXmlId.isEmpty() || m_bHaveAbout || !m_sProperty.isEmpty())
1984 : {
1985 : try {
1986 : const uno::Reference<container::XEnumerationAccess> xEA
1987 36 : (xAttrCursor, uno::UNO_QUERY_THROW);
1988 : const uno::Reference<container::XEnumeration> xEnum(
1989 72 : xEA->createEnumeration(), uno::UNO_QUERY_THROW);
1990 : SAL_WARN_IF(!xEnum->hasMoreElements(), "xmloff.text", "xml:id: no paragraph?");
1991 36 : if (xEnum->hasMoreElements()) {
1992 36 : uno::Reference<rdf::XMetadatable> xMeta;
1993 36 : xEnum->nextElement() >>= xMeta;
1994 : SAL_WARN_IF(!xMeta.is(), "xmloff.text", "xml:id: not XMetadatable");
1995 36 : GetImport().SetXmlId(xMeta, m_sXmlId);
1996 36 : if (m_bHaveAbout)
1997 : {
1998 34 : GetImport().AddRDFa(xMeta,
1999 68 : m_sAbout, m_sProperty, m_sContent, m_sDatatype);
2000 : }
2001 36 : SAL_WARN_IF(xEnum->hasMoreElements(), "xmloff.text", "xml:id: > 1 paragraph?");
2002 36 : }
2003 0 : } catch (const uno::Exception &) {
2004 : SAL_INFO("xmloff.text", "XMLParaContext::~XMLParaContext: exception");
2005 : }
2006 : }
2007 :
2008 15200 : OUString const sCellParaStyleName(xTxtImport->GetCellParaStyleDefault());
2009 7600 : if( !sCellParaStyleName.isEmpty() )
2010 : {
2011 : /* Suppress handling of outline and list attributes,
2012 : because of side effects of method <SetStyleAndAttrs(..)> (#i80724#)
2013 : */
2014 929 : xTxtImport->SetStyleAndAttrs( GetImport(), xAttrCursor,
2015 : sCellParaStyleName,
2016 : true,
2017 : false, -1, // suppress outline handling
2018 929 : false ); // suppress list attributes handling
2019 : }
2020 :
2021 : // #103445# for headings without style name, find the proper style
2022 7600 : if( bHeading && sStyleName.isEmpty() )
2023 0 : xTxtImport->FindOutlineStyleName( sStyleName, nOutlineLevel );
2024 :
2025 : // set style and hard attributes at the previous paragraph
2026 : // Add parameter <mbOutlineLevelAttrFound> (#i73509#)
2027 15200 : sStyleName = xTxtImport->SetStyleAndAttrs( GetImport(), xAttrCursor,
2028 : sStyleName,
2029 : true,
2030 : mbOutlineLevelAttrFound,
2031 7600 : bHeading ? nOutlineLevel : -1 );
2032 :
2033 : // handle list style header
2034 7600 : if (bHeading && (bIsListHeader || bIsRestart))
2035 : {
2036 1 : Reference<XPropertySet> xPropSet( xAttrCursor, UNO_QUERY );
2037 :
2038 1 : if (xPropSet.is())
2039 : {
2040 1 : if (bIsListHeader)
2041 : {
2042 : OUString sNumberingIsNumber
2043 0 : ("NumberingIsNumber");
2044 0 : if(xPropSet->getPropertySetInfo()->
2045 0 : hasPropertyByName(sNumberingIsNumber))
2046 : {
2047 0 : xPropSet->setPropertyValue
2048 0 : (sNumberingIsNumber, makeAny( false ) );
2049 0 : }
2050 : }
2051 1 : if (bIsRestart)
2052 : {
2053 : OUString sParaIsNumberingRestart
2054 1 : ("ParaIsNumberingRestart");
2055 : OUString sNumberingStartValue
2056 2 : ("NumberingStartValue");
2057 2 : if (xPropSet->getPropertySetInfo()->
2058 1 : hasPropertyByName(sParaIsNumberingRestart))
2059 : {
2060 1 : xPropSet->setPropertyValue
2061 1 : (sParaIsNumberingRestart, makeAny(true));
2062 : }
2063 :
2064 2 : if (xPropSet->getPropertySetInfo()->
2065 1 : hasPropertyByName(sNumberingStartValue))
2066 : {
2067 1 : xPropSet->setPropertyValue
2068 1 : (sNumberingStartValue, makeAny(nStartValue));
2069 1 : }
2070 : }
2071 :
2072 1 : }
2073 : }
2074 :
2075 7600 : if( pHints && !pHints->empty() )
2076 : {
2077 9702 : for( size_t i=0; i<pHints->size(); i++ )
2078 : {
2079 6034 : XMLHint_Impl *pHint = &(*pHints)[i];
2080 6034 : xAttrCursor->gotoRange( pHint->GetStart(), sal_False );
2081 6034 : xAttrCursor->gotoRange( pHint->GetEnd(), sal_True );
2082 6034 : switch( pHint->GetType() )
2083 : {
2084 : case XML_HINT_STYLE:
2085 : {
2086 : const OUString& rStyleName =
2087 5865 : static_cast<XMLStyleHint_Impl *>(pHint)->GetStyleName();
2088 5865 : if( !rStyleName.isEmpty() )
2089 5865 : xTxtImport->SetStyleAndAttrs( GetImport(),
2090 : xAttrCursor, rStyleName,
2091 5865 : false );
2092 : }
2093 5865 : break;
2094 : case XML_HINT_REFERENCE:
2095 : {
2096 : const OUString& rRefName =
2097 0 : static_cast<XMLReferenceHint_Impl *>(pHint)->GetRefName();
2098 0 : if( !rRefName.isEmpty() )
2099 : {
2100 0 : if( !pHint->GetEnd().is() )
2101 0 : pHint->SetEnd(xEnd);
2102 :
2103 : // reference name uses rStyleName member
2104 : // borrow from XMLTextMarkImportContext
2105 : XMLTextMarkImportContext::CreateAndInsertMark(
2106 0 : GetImport(),
2107 : OUString( "com.sun.star.text.ReferenceMark"),
2108 : rRefName,
2109 0 : xAttrCursor);
2110 : }
2111 : }
2112 0 : break;
2113 : case XML_HINT_HYPERLINK:
2114 : {
2115 : const XMLHyperlinkHint_Impl *pHHint =
2116 64 : static_cast<const XMLHyperlinkHint_Impl *>(pHint);
2117 64 : xTxtImport->SetHyperlink( GetImport(),
2118 : xAttrCursor,
2119 64 : pHHint->GetHRef(),
2120 64 : pHHint->GetName(),
2121 64 : pHHint->GetTargetFrameName(),
2122 64 : pHHint->GetStyleName(),
2123 64 : pHHint->GetVisitedStyleName(),
2124 128 : pHHint->GetEventsContext() );
2125 : }
2126 64 : break;
2127 : case XML_HINT_INDEX_MARK:
2128 : {
2129 : Reference<beans::XPropertySet> xMark(
2130 0 : static_cast<const XMLIndexMarkHint_Impl *>(pHint)->GetMark());
2131 0 : Reference<XTextContent> xContent(xMark, UNO_QUERY);
2132 0 : xTxtImport->GetText()->insertTextContent(
2133 0 : xAttrCursor, xContent, sal_True );
2134 : }
2135 0 : break;
2136 : case XML_HINT_TEXT_FRAME:
2137 : {
2138 : const XMLTextFrameHint_Impl *pFHint =
2139 12 : static_cast<const XMLTextFrameHint_Impl *>(pHint);
2140 : // Check for text content (#i33242#)
2141 : Reference < XTextContent > xTextContent =
2142 12 : pFHint->GetTextContent();
2143 12 : if ( xTextContent.is() )
2144 : {
2145 : /* Core impl. of the unification of drawing objects and
2146 : Writer fly frames (#i26791#)
2147 : */
2148 12 : if ( pFHint->IsBoundAtChar() )
2149 : {
2150 10 : xTextContent->attach( xAttrCursor );
2151 : }
2152 : }
2153 : /* Consider, that hint can also contain a shape -
2154 : e.g. drawing object of type 'Text'. (#i33242#)
2155 : */
2156 : else
2157 : {
2158 0 : Reference < XShape > xShape = pFHint->GetShape();
2159 0 : if ( xShape.is() )
2160 : {
2161 : // determine anchor type
2162 0 : Reference < XPropertySet > xPropSet( xShape, UNO_QUERY );
2163 : TextContentAnchorType eAnchorType =
2164 0 : TextContentAnchorType_AT_PARAGRAPH;
2165 : {
2166 0 : OUString sAnchorType( "AnchorType" );
2167 0 : Any aAny = xPropSet->getPropertyValue( sAnchorType );
2168 0 : aAny >>= eAnchorType;
2169 : }
2170 0 : if ( TextContentAnchorType_AT_CHARACTER == eAnchorType )
2171 : {
2172 : // set anchor position for at-character anchored objects
2173 0 : Reference<XTextRange> xRange(xAttrCursor, UNO_QUERY);
2174 0 : Any aPos;
2175 0 : aPos <<= xRange;
2176 0 : OUString sTextRange( "TextRange" );
2177 0 : xPropSet->setPropertyValue(sTextRange, aPos);
2178 0 : }
2179 0 : }
2180 12 : }
2181 : }
2182 12 : break;
2183 : /* Core impl. of the unification of drawing objects and
2184 : Writer fly frames (#i26791#)
2185 : */
2186 : case XML_HINT_DRAW:
2187 : {
2188 : const XMLDrawHint_Impl *pDHint =
2189 93 : static_cast<const XMLDrawHint_Impl*>(pHint);
2190 : // Improvement: hint directly provides the shape. (#i33242#)
2191 93 : Reference < XShape > xShape = pDHint->GetShape();
2192 93 : if ( xShape.is() )
2193 : {
2194 : // determine anchor type
2195 76 : Reference < XPropertySet > xPropSet( xShape, UNO_QUERY );
2196 76 : TextContentAnchorType eAnchorType = TextContentAnchorType_AT_PARAGRAPH;
2197 : {
2198 76 : OUString sAnchorType( "AnchorType" );
2199 152 : Any aAny = xPropSet->getPropertyValue( sAnchorType );
2200 152 : aAny >>= eAnchorType;
2201 : }
2202 76 : if ( TextContentAnchorType_AT_CHARACTER == eAnchorType )
2203 : {
2204 : // set anchor position for at-character anchored objects
2205 1 : Reference<XTextRange> xRange(xAttrCursor, UNO_QUERY);
2206 2 : Any aPos;
2207 1 : aPos <<= xRange;
2208 2 : OUString sTextRange( "TextRange" );
2209 2 : xPropSet->setPropertyValue(sTextRange, aPos);
2210 76 : }
2211 93 : }
2212 : }
2213 93 : break;
2214 : default:
2215 : SAL_WARN( "xmloff.text", "What's this" );
2216 0 : break;
2217 : }
2218 : }
2219 : }
2220 15200 : delete pHints;
2221 15200 : }
2222 :
2223 10598 : SvXMLImportContext *XMLParaContext::CreateChildContext(
2224 : sal_uInt16 nPrefix, const OUString& rLocalName,
2225 : const Reference< xml::sax::XAttributeList > & xAttrList )
2226 : {
2227 : const SvXMLTokenMap& rTokenMap =
2228 10598 : GetImport().GetTextImport()->GetTextPElemTokenMap();
2229 10598 : sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
2230 10598 : if( !pHints )
2231 5222 : pHints = new XMLHints_Impl;
2232 : return XMLImpSpanContext_Impl::CreateChildContext(
2233 10598 : GetImport(), nPrefix, rLocalName, xAttrList,
2234 : nToken, *pHints, bIgnoreLeadingSpace
2235 : , nStarFontsConvFlags
2236 21196 : );
2237 : }
2238 :
2239 5885 : void XMLParaContext::Characters( const OUString& rChars )
2240 : {
2241 : OUString sChars =
2242 5885 : GetImport().GetTextImport()->ConvertStarFonts( rChars, sStyleName,
2243 : nStarFontsConvFlags,
2244 11770 : true, GetImport() );
2245 5885 : GetImport().GetTextImport()->InsertString( sChars, bIgnoreLeadingSpace );
2246 5885 : }
2247 :
2248 0 : TYPEINIT1( XMLNumberedParaContext, SvXMLImportContext );
2249 :
2250 0 : XMLNumberedParaContext::XMLNumberedParaContext(
2251 : SvXMLImport& i_rImport,
2252 : sal_uInt16 i_nPrefix,
2253 : const OUString& i_rLocalName,
2254 : const Reference< xml::sax::XAttributeList > & i_xAttrList ) :
2255 : SvXMLImportContext( i_rImport, i_nPrefix, i_rLocalName ),
2256 : m_Level(0),
2257 : m_StartValue(-1),
2258 : m_ListId(),
2259 0 : m_xNumRules()
2260 : {
2261 0 : OUString StyleName;
2262 :
2263 : const SvXMLTokenMap& rTokenMap(
2264 0 : i_rImport.GetTextImport()->GetTextNumberedParagraphAttrTokenMap() );
2265 :
2266 0 : const sal_Int16 nAttrCount( i_xAttrList.is() ?
2267 0 : i_xAttrList->getLength() : 0 );
2268 0 : for ( sal_Int16 i=0; i < nAttrCount; i++ )
2269 : {
2270 0 : const OUString& rAttrName( i_xAttrList->getNameByIndex( i ) );
2271 0 : const OUString& rValue ( i_xAttrList->getValueByIndex( i ) );
2272 :
2273 0 : OUString aLocalName;
2274 : const sal_uInt16 nPrefix(
2275 0 : GetImport().GetNamespaceMap().GetKeyByAttrName(
2276 0 : rAttrName, &aLocalName ) );
2277 0 : switch( rTokenMap.Get( nPrefix, aLocalName ) )
2278 : {
2279 : case XML_TOK_TEXT_NUMBERED_PARAGRAPH_XMLID:
2280 0 : m_XmlId = rValue;
2281 : //FIXME: there is no UNO API for lists
2282 0 : break;
2283 : case XML_TOK_TEXT_NUMBERED_PARAGRAPH_LIST_ID:
2284 0 : m_ListId = rValue;
2285 0 : break;
2286 : case XML_TOK_TEXT_NUMBERED_PARAGRAPH_LEVEL:
2287 : {
2288 0 : sal_Int32 nTmp = rValue.toInt32();
2289 0 : if ( nTmp >= 1 && nTmp <= SHRT_MAX ) {
2290 0 : m_Level = static_cast<sal_uInt16>(nTmp) - 1;
2291 : }
2292 : }
2293 0 : break;
2294 : case XML_TOK_TEXT_NUMBERED_PARAGRAPH_STYLE_NAME:
2295 0 : StyleName = rValue;
2296 0 : break;
2297 : case XML_TOK_TEXT_NUMBERED_PARAGRAPH_CONTINUE_NUMBERING:
2298 : // this attribute is deprecated
2299 : // ContinuteNumbering = IsXMLToken(rValue, XML_TRUE);
2300 0 : break;
2301 : case XML_TOK_TEXT_NUMBERED_PARAGRAPH_START_VALUE:
2302 : {
2303 0 : sal_Int32 nTmp = rValue.toInt32();
2304 0 : if ( nTmp >= 0 && nTmp <= SHRT_MAX ) {
2305 0 : m_StartValue = static_cast<sal_Int16>(nTmp);
2306 : }
2307 : }
2308 0 : break;
2309 : }
2310 0 : }
2311 :
2312 : XMLTextListsHelper& rTextListsHelper(
2313 0 : i_rImport.GetTextImport()->GetTextListHelper() );
2314 0 : if (m_ListId.isEmpty())
2315 : {
2316 : SAL_WARN_IF( i_rImport.GetODFVersion() == "1.2", "xmloff.text", "invalid numbered-paragraph: no list-id (1.2)" );
2317 0 : m_ListId = rTextListsHelper.GetNumberedParagraphListId(m_Level,
2318 0 : StyleName);
2319 : SAL_WARN_IF(m_ListId.isEmpty(), "xmloff.text", "numbered-paragraph: no ListId");
2320 0 : if (m_ListId.isEmpty()) {
2321 0 : return;
2322 : }
2323 : }
2324 0 : m_xNumRules = rTextListsHelper.EnsureNumberedParagraph( i_rImport,
2325 0 : m_ListId, m_Level, StyleName);
2326 :
2327 : SAL_WARN_IF(!m_xNumRules.is(), "xmloff.text", "numbered-paragraph: no NumRules");
2328 :
2329 0 : i_rImport.GetTextImport()->GetTextListHelper().PushListContext( this );
2330 : }
2331 :
2332 0 : XMLNumberedParaContext::~XMLNumberedParaContext()
2333 : {
2334 0 : }
2335 :
2336 0 : void XMLNumberedParaContext::EndElement()
2337 : {
2338 0 : if (!m_ListId.isEmpty()) {
2339 0 : GetImport().GetTextImport()->PopListContext();
2340 : }
2341 0 : }
2342 :
2343 0 : SvXMLImportContext *XMLNumberedParaContext::CreateChildContext(
2344 : sal_uInt16 i_nPrefix, const OUString& i_rLocalName,
2345 : const Reference< xml::sax::XAttributeList > & i_xAttrList )
2346 : {
2347 0 : SvXMLImportContext *pContext( 0 );
2348 :
2349 0 : if ( XML_NAMESPACE_TEXT == i_nPrefix ||
2350 : XML_NAMESPACE_LO_EXT == i_nPrefix )
2351 : {
2352 0 : bool bIsHeader( IsXMLToken( i_rLocalName, XML_H ) );
2353 0 : if ( bIsHeader || IsXMLToken( i_rLocalName, XML_P ) )
2354 : {
2355 0 : pContext = new XMLParaContext( GetImport(),
2356 0 : i_nPrefix, i_rLocalName, i_xAttrList, bIsHeader );
2357 : // ignore text:number } else if (IsXMLToken( i_rLocalName, XML_NUMBER )) {
2358 : }
2359 : }
2360 :
2361 0 : if (!pContext) {
2362 : pContext = SvXMLImportContext::CreateChildContext(
2363 0 : i_nPrefix, i_rLocalName, i_xAttrList );
2364 : }
2365 :
2366 0 : return pContext;
2367 : }
2368 :
2369 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|