1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
12 #include "sectfrm.hxx"
19 #include "sortedobjs.hxx"
20 #include <anchoredobject.hxx>
21 #include <libxml/xmlwriter.h>
22 #include <SwPortionHandler.hxx>
24 class XmlPortionDumper
:public SwPortionHandler
27 xmlTextWriterPtr writer
;
30 const char* getTypeName( sal_uInt16 nType
)
34 case POR_LIN
: return "POR_LIN";
35 case POR_FLYCNT
: return "POR_FLYCNT";
37 case POR_HOLE
: return "POR_HOLE";
38 case POR_TMPEND
: return "POR_TMPEND";
39 case POR_BRK
: return "POR_BRK";
40 case POR_KERN
: return "POR_KERN";
41 case POR_ARROW
: return "POR_ARROW";
42 case POR_MULTI
: return "POR_MULTI";
43 case POR_HIDDEN_TXT
: return "POR_HIDDEN_TXT";
44 case POR_CONTROLCHAR
: return "POR_CONTROLCHAR";
46 case POR_TXT
: return "POR_TXT";
47 case POR_LAY
: return "POR_LAY";
48 case POR_PARA
: return "POR_PARA";
49 case POR_URL
: return "POR_URL";
50 case POR_HNG
: return "POR_HNG";
52 case POR_DROP
: return "POR_DROP";
53 case POR_TOX
: return "POR_TOX";
54 case POR_ISOTOX
: return "POR_ISOTOX";
55 case POR_REF
: return "POR_REF";
56 case POR_ISOREF
: return "POR_ISOREF";
57 case POR_META
: return "POR_META";
59 case POR_EXP
: return "POR_EXP";
60 case POR_BLANK
: return "POR_BLANK";
61 case POR_POSTITS
: return "POR_POSTITS";
63 case POR_HYPH
: return "POR_HYPH";
64 case POR_HYPHSTR
: return "POR_HYPHSTR";
65 case POR_SOFTHYPH
: return "POR_SOFTHYPH";
66 case POR_SOFTHYPHSTR
: return "POR_SOFTHYPHSTR";
67 case POR_SOFTHYPH_COMP
: return "POR_SOFTHYPH_COMP";
69 case POR_FLD
: return "POR_FLD";
70 case POR_HIDDEN
: return "POR_HIDDEN";
71 case POR_QUOVADIS
: return "POR_QUOVADIS";
72 case POR_ERGOSUM
: return "POR_ERGOSUM";
73 case POR_COMBINED
: return "POR_COMBINED";
74 case POR_FTN
: return "POR_FTN";
76 case POR_FTNNUM
: return "POR_FTNNUM";
77 case POR_NUMBER
: return "POR_NUMBER";
78 case POR_BULLET
: return "POR_BULLET";
79 case POR_GRFNUM
: return "POR_GRFNUM";
81 case POR_GLUE
: return "POR_GLUE";
83 case POR_MARGIN
: return "POR_MARGIN";
85 case POR_FIX
: return "POR_FIX";
86 case POR_FLY
: return "POR_FLY";
88 case POR_TAB
: return "POR_TAB";
90 case POR_TABRIGHT
: return "POR_TABRIGHT";
91 case POR_TABCENTER
: return "POR_TABCENTER";
92 case POR_TABDECIMAL
: return "POR_TABDECIMAL";
94 case POR_TABLEFT
: return "POR_TABLEFT";
102 XmlPortionDumper( xmlTextWriterPtr some_writer
):writer( some_writer
), ofs( 0 )
106 virtual ~ XmlPortionDumper( )
112 length of this portion in the model string
114 text which is painted on-screen
116 virtual void Text( sal_uInt16 nLength
,
122 xmlTextWriterStartElement( writer
, BAD_CAST( "Text" ) );
123 xmlTextWriterWriteFormatAttribute( writer
,
124 BAD_CAST( "nLength" ),
125 "%i", ( int ) nLength
);
126 xmlTextWriterWriteFormatAttribute( writer
,
128 "%s", getTypeName( nType
) );
130 xmlTextWriterWriteFormatAttribute(writer
, BAD_CAST("nHeight"), "%i", (int)nHeight
);
132 xmlTextWriterWriteFormatAttribute(writer
, BAD_CAST("nWidth"), "%i", (int)nWidth
);
134 xmlTextWriterEndElement( writer
);
139 length of this portion in the model string
141 text which is painted on-screen
145 font size of the painted text
147 virtual void Special( sal_uInt16 nLength
,
148 const String
& rText
,
153 xmlTextWriterStartElement( writer
, BAD_CAST( "Special" ) );
154 xmlTextWriterWriteFormatAttribute( writer
,
155 BAD_CAST( "nLength" ),
156 "%i", ( int ) nLength
);
157 xmlTextWriterWriteFormatAttribute( writer
,
159 "%s", getTypeName( nType
) );
160 OUString
sText( rText
);
161 OString sText8
=OUStringToOString( sText
,
162 RTL_TEXTENCODING_UTF8
);
163 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "rText" ),
164 "%s", sText8
.getStr( ) );
167 xmlTextWriterWriteFormatAttribute(writer
, BAD_CAST("nHeight"), "%i", (int)nHeight
);
170 xmlTextWriterWriteFormatAttribute(writer
, BAD_CAST("nWidth"), "%i", (int)nWidth
);
172 xmlTextWriterEndElement( writer
);
176 virtual void LineBreak( KSHORT nWidth
)
178 xmlTextWriterStartElement( writer
, BAD_CAST( "LineBreak" ) );
180 xmlTextWriterWriteFormatAttribute( writer
,
181 BAD_CAST( "nWidth" ),
182 "%i", ( int ) nWidth
);
183 xmlTextWriterEndElement( writer
);
188 * number of 'model string' characters to be skipped
190 virtual void Skip( sal_uInt16 nLength
)
192 xmlTextWriterStartElement( writer
, BAD_CAST( "Skip" ) );
193 xmlTextWriterWriteFormatAttribute( writer
,
194 BAD_CAST( "nLength" ),
195 "%i", ( int ) nLength
);
196 xmlTextWriterEndElement( writer
);
200 virtual void Finish( )
202 xmlTextWriterStartElement( writer
, BAD_CAST( "Finish" ) );
203 xmlTextWriterEndElement( writer
);
210 xmlTextWriterPtr
lcl_createDefaultWriter()
212 xmlTextWriterPtr writer
= xmlNewTextWriterFilename( "layout.xml", 0 );
213 xmlTextWriterStartDocument( writer
, NULL
, NULL
, NULL
);
217 void lcl_freeWriter( xmlTextWriterPtr writer
)
219 xmlTextWriterEndDocument( writer
);
220 xmlFreeTextWriter( writer
);
224 void SwFrm::dumpAsXml( xmlTextWriterPtr writer
)
226 bool bCreateWriter
= ( NULL
== writer
);
228 writer
= lcl_createDefaultWriter();
230 const char *name
= NULL
;
232 switch ( GetType( ) )
286 xmlTextWriterStartElement( writer
, ( const xmlChar
* ) name
);
288 dumpAsXmlAttributes( writer
);
290 xmlTextWriterStartElement( writer
, BAD_CAST( "infos" ) );
291 dumpInfosAsXml( writer
);
292 xmlTextWriterEndElement( writer
);
294 // Dump Anchored objects if any
295 SwSortedObjs
* pAnchored
= GetDrawObjs();
296 if ( pAnchored
&& pAnchored
->Count( ) > 0 )
298 xmlTextWriterStartElement( writer
, BAD_CAST( "anchored" ) );
300 for ( sal_uInt32 i
= 0, len
= pAnchored
->Count(); i
< len
; i
++ )
302 SwAnchoredObject
* pObject
= (*pAnchored
)[i
];
303 pObject
->dumpAsXml( writer
);
306 xmlTextWriterEndElement( writer
);
312 SwTxtFrm
*pTxtFrm
= ( SwTxtFrm
* ) this;
313 OUString aTxt
= pTxtFrm
->GetTxt( );
314 for ( int i
= 0; i
< 32; i
++ )
316 aTxt
= aTxt
.replace( i
, '*' );
318 OString aTxt8
=OUStringToOString( aTxt
,
319 RTL_TEXTENCODING_UTF8
);
320 xmlTextWriterWriteString( writer
,
321 ( const xmlChar
* ) aTxt8
.getStr( ) );
322 XmlPortionDumper
pdumper( writer
);
323 pTxtFrm
->VisitPortions( pdumper
);
328 dumpChildrenAsXml( writer
);
330 xmlTextWriterEndElement( writer
);
334 lcl_freeWriter( writer
);
337 void SwFrm::dumpInfosAsXml( xmlTextWriterPtr writer
)
340 xmlTextWriterStartElement( writer
, BAD_CAST( "bounds" ) );
341 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "left" ), "%ld", Frm().Left() );
342 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "top" ), "%ld", Frm().Top() );
343 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "width" ), "%ld", Frm().Width() );
344 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "height" ), "%ld", Frm().Height() );
345 xmlTextWriterEndElement( writer
);
348 void SwFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer
)
350 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "ptr" ), "%p", this );
351 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "id" ), "%" SAL_PRIuUINT32
, GetFrmId() );
352 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "symbol" ), "%s", BAD_CAST( typeid( *this ).name( ) ) );
354 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "next" ), "%" SAL_PRIuUINT32
, GetNext()->GetFrmId() );
356 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "prev" ), "%" SAL_PRIuUINT32
, GetPrev()->GetFrmId() );
358 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "upper" ), "%" SAL_PRIuUINT32
, GetUpper()->GetFrmId() );
360 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "lower" ), "%" SAL_PRIuUINT32
, GetLower()->GetFrmId() );
363 SwTxtFrm
*pTxtFrm
= ( SwTxtFrm
* ) this;
364 SwTxtNode
*pTxtNode
= pTxtFrm
->GetTxtNode();
365 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "txtNodeIndex" ), "%lu", pTxtNode
->GetIndex() );
367 if (IsHeaderFrm() || IsFooterFrm())
369 SwHeadFootFrm
*pHeadFootFrm
= (SwHeadFootFrm
*)this;
370 OUString aFmtName
= pHeadFootFrm
->GetFmt()->GetName();
371 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "fmtName" ), "%s", BAD_CAST(OUStringToOString(aFmtName
, RTL_TEXTENCODING_UTF8
).getStr()));
372 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "fmtPtr" ), "%p", pHeadFootFrm
->GetFmt());
376 void SwFrm::dumpChildrenAsXml( xmlTextWriterPtr writer
)
378 SwFrm
*pFrm
= GetLower( );
379 for ( ; pFrm
!= NULL
; pFrm
= pFrm
->GetNext( ) )
381 pFrm
->dumpAsXml( writer
);
385 void SwAnchoredObject::dumpAsXml( xmlTextWriterPtr writer
)
387 bool bCreateWriter
= ( NULL
== writer
);
389 writer
= lcl_createDefaultWriter();
391 xmlTextWriterStartElement( writer
, BAD_CAST( getElementName() ) );
392 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "ptr" ), "%p", this );
393 xmlTextWriterEndElement( writer
);
396 lcl_freeWriter( writer
);
399 void SwTxtFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer
)
401 SwFrm::dumpAsXmlAttributes( writer
);
403 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "follow" ), "%" SAL_PRIuUINT32
, GetFollow()->GetFrmId() );
405 if (m_pPrecede
!= NULL
)
406 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "precede" ), "%" SAL_PRIuUINT32
, static_cast<SwTxtFrm
*>(m_pPrecede
)->GetFrmId() );
409 void SwSectionFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer
)
411 SwFrm::dumpAsXmlAttributes( writer
);
413 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "follow" ), "%" SAL_PRIuUINT32
, GetFollow()->GetFrmId() );
415 if (m_pPrecede
!= NULL
)
416 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "precede" ), "%" SAL_PRIuUINT32
, static_cast<SwSectionFrm
*>( m_pPrecede
)->GetFrmId() );
419 void SwTabFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer
)
421 SwFrm::dumpAsXmlAttributes( writer
);
423 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "follow" ), "%" SAL_PRIuUINT32
, GetFollow()->GetFrmId() );
425 if (m_pPrecede
!= NULL
)
426 xmlTextWriterWriteFormatAttribute( writer
, BAD_CAST( "precede" ), "%" SAL_PRIuUINT32
, static_cast<SwTabFrm
*>( m_pPrecede
)->GetFrmId() );
429 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */