4340dbd16802103888a049f9207dc819b06ad336
[platform/upstream/doxygen.git] / addon / doxmlparser / src / dochandler.h
1 /******************************************************************************
2  *
3  * $Id$
4  *
5  *
6  * Copyright (C) 1997-2015 by Dimitri van Heesch.
7  *
8  * Permission to use, copy, modify, and distribute this software and its
9  * documentation under the terms of the GNU General Public License is hereby 
10  * granted. No representations are made about the suitability of this software 
11  * for any purpose. It is provided "as is" without express or implied warranty.
12  * See the GNU General Public License for more details.
13  *
14  */
15
16 #ifndef _DOCHANDLER_H
17 #define _DOCHANDLER_H
18
19 #include <qstring.h>
20 #include <qlist.h>
21 #include <qxml.h>
22
23 #include <doxmlintf.h>
24 #include "stringimpl.h"
25 #include "basehandler.h"
26 #include "baseiterator.h"
27
28 class ParagraphHandler;
29 class DocInternalHandler;
30 class LinkedTextImpl;
31 class LinkedTextHandler;
32
33 //-----------------------------------------------------------------------------
34
35 class DocImpl : public IDoc { public: virtual ~DocImpl() {} };
36
37 #define DEFINE_CLS_IMPL(cls) \
38   class cls##Impl : public I##cls, public DocImpl { public: virtual ~cls##Impl() {} }
39
40 DEFINE_CLS_IMPL(DocMarkup);
41 DEFINE_CLS_IMPL(DocPara);
42 DEFINE_CLS_IMPL(DocText);
43 DEFINE_CLS_IMPL(DocMarkupModifier);
44 DEFINE_CLS_IMPL(DocItemizedList);
45 DEFINE_CLS_IMPL(DocOrderedList);
46 DEFINE_CLS_IMPL(DocListItem);
47 DEFINE_CLS_IMPL(DocParameterList);
48 DEFINE_CLS_IMPL(DocParameterItem);
49 DEFINE_CLS_IMPL(DocParameter);
50 DEFINE_CLS_IMPL(DocTitle);
51 DEFINE_CLS_IMPL(DocSimpleSect);
52 DEFINE_CLS_IMPL(DocRef);
53 DEFINE_CLS_IMPL(DocVariableList);
54 DEFINE_CLS_IMPL(DocVariableListEntry);
55 DEFINE_CLS_IMPL(DocHRuler);
56 DEFINE_CLS_IMPL(DocLineBreak);
57 DEFINE_CLS_IMPL(DocULink);
58 DEFINE_CLS_IMPL(DocEMail);
59 DEFINE_CLS_IMPL(DocLink);
60 DEFINE_CLS_IMPL(DocProgramListing);
61 DEFINE_CLS_IMPL(DocCodeLine);
62 DEFINE_CLS_IMPL(DocHighlight);
63 DEFINE_CLS_IMPL(DocFormula);
64 DEFINE_CLS_IMPL(DocImage);
65 DEFINE_CLS_IMPL(DocDotFile);
66 DEFINE_CLS_IMPL(DocIndexEntry);
67 DEFINE_CLS_IMPL(DocTable);
68 DEFINE_CLS_IMPL(DocRow);
69 DEFINE_CLS_IMPL(DocEntry);
70 DEFINE_CLS_IMPL(DocSection);
71 DEFINE_CLS_IMPL(DocVerbatim);
72 DEFINE_CLS_IMPL(DocCopy);
73 DEFINE_CLS_IMPL(DocTocList);
74 DEFINE_CLS_IMPL(DocTocItem);
75 DEFINE_CLS_IMPL(DocAnchor);
76 DEFINE_CLS_IMPL(DocSymbol);
77 DEFINE_CLS_IMPL(DocInternal);
78 DEFINE_CLS_IMPL(DocRoot);
79
80 //-----------------------------------------------------------------------------
81
82
83 /*! \brief Node representing a piece of text.
84  *
85  */
86 class TextNode : public DocTextImpl
87 {
88   public:
89     TextNode(const QString &t,int markup,int level) 
90       : m_text(t), m_markup(markup), m_headingLevel(level) {}
91     virtual ~TextNode() {}
92
93     // IDocText
94     virtual Kind kind() const { return DocImpl::Text; }
95     virtual const IString *text() const { return &m_text; }
96     virtual int markup() const { return m_markup; }
97     virtual int headingLevel() const { return m_headingLevel; }
98   
99   private:  
100     StringImpl m_text;
101     int m_markup;
102     int m_headingLevel;
103 };
104
105 //-----------------------------------------------------------------------------
106
107 /*! \brief Node representing a change in the markup style.
108  *
109  */
110 class MarkupModifierNode : public DocMarkupModifierImpl
111 {
112   public:
113     MarkupModifierNode(int markup,bool enabled,int level=0) 
114       : m_markup(markup), m_enabled(enabled), m_headingLevel(level) {}
115     virtual ~MarkupModifierNode() {}
116   
117     // IDocMarkupModifier
118     virtual Kind kind() const { return DocImpl::MarkupModifier; }
119     virtual bool enabled() const { return m_enabled; }
120     virtual int markup() const { return m_markup; }
121     virtual int headingLevel() const { return m_headingLevel; }
122
123   private:
124     int m_markup;
125     bool m_enabled;
126     int m_headingLevel;
127 };
128
129
130 //-----------------------------------------------------------------------------
131
132 /*! \brief Handles markup commands in the XML input. 
133  *
134  */
135 class MarkupHandler : public BaseFallBackHandler<MarkupHandler>
136 {
137   public:
138     MarkupHandler(QList<DocImpl> &children,QString &curString);
139     virtual ~MarkupHandler();
140     int markup() const { return m_curMarkup; }
141     int headingLevel() const { return m_headingLevel; }
142
143     virtual void startBold(const QXmlAttributes &attrib);
144     virtual void endBold();
145     virtual void startEmphasis(const QXmlAttributes &attrib);
146     virtual void endEmphasis();
147     virtual void startComputerOutput(const QXmlAttributes &attrib);
148     virtual void endComputerOutput();
149     virtual void startCenter(const QXmlAttributes &attrib);
150     virtual void endCenter();
151     virtual void startSmallFont(const QXmlAttributes &attrib);
152     virtual void endSmallFont();
153     virtual void startSubscript(const QXmlAttributes &attrib);
154     virtual void endSubscript();
155     virtual void startSuperscript(const QXmlAttributes &attrib);
156     virtual void endSuperscript();
157     virtual void startPreformatted(const QXmlAttributes &attrib);
158     virtual void endPreformatted();
159     virtual void startHeading1(const QXmlAttributes &attrib);
160     virtual void endHeading1();
161     virtual void startHeading2(const QXmlAttributes &attrib);
162     virtual void endHeading2();
163     virtual void startHeading3(const QXmlAttributes &attrib);
164     virtual void endHeading3();
165     virtual void startHeading4(const QXmlAttributes &attrib);
166     virtual void endHeading4();
167     virtual void startHeading5(const QXmlAttributes &attrib);
168     virtual void endHeading5();
169     virtual void startHeading6(const QXmlAttributes &attrib);
170     virtual void endHeading6();
171
172
173   private:
174     void addTextNode();
175
176     QList<DocImpl>  &m_children;
177     QString         &m_curString;
178     int             m_curMarkup;
179     int             m_headingLevel;
180 };
181
182 //-----------------------------------------------------------------------------
183
184 /*! \brief Node representing a paragraph of text and commands.
185  *
186  */
187 // children: itemizedlist, orderedlist, parameterlist, simplesect, ref,
188 //           variablelist, hruler, linebreak, ulink, email, link
189 //           programlisting, formula, image, dotfile, indexentry,
190 //           table
191 //
192 // children handled by MarkupHandler: 
193 //           bold, computeroutput, emphasis, center,
194 //           small, subscript, superscript. 
195 //
196 class ParagraphHandler : public DocParaImpl, 
197                          public BaseHandler<ParagraphHandler>
198 {
199     friend class ParagraphIterator;
200
201   public:
202     virtual void startParagraph(const QXmlAttributes& attrib);
203     virtual void endParagraph();
204     virtual void startItemizedList(const QXmlAttributes& attrib);
205     virtual void startOrderedList(const QXmlAttributes& attrib);
206     virtual void startParameterList(const QXmlAttributes& attrib);
207     virtual void startSimpleSect(const QXmlAttributes& attrib);
208     virtual void startRef(const QXmlAttributes& attrib);
209     virtual void startVariableList(const QXmlAttributes& attrib);
210     virtual void startHRuler(const QXmlAttributes& attrib);
211     virtual void startLineBreak(const QXmlAttributes& attrib);
212     virtual void startULink(const QXmlAttributes& attrib);
213     virtual void startEMail(const QXmlAttributes& attrib);
214     virtual void startLink(const QXmlAttributes& attrib);
215     virtual void startProgramListing(const QXmlAttributes& attrib);
216     virtual void startFormula(const QXmlAttributes& attrib);
217     virtual void startImage(const QXmlAttributes& attrib);
218     virtual void startDotFile(const QXmlAttributes& attrib);
219     virtual void startIndexEntry(const QXmlAttributes& attrib);
220     virtual void startTable(const QXmlAttributes& attrib);
221     virtual void startVerbatim(const QXmlAttributes& attrib);
222     virtual void startHtmlOnly(const QXmlAttributes& attrib);
223     virtual void startLatexOnly(const QXmlAttributes& attrib);
224     virtual void startUmlaut(const QXmlAttributes& attrib);
225     virtual void startAcute(const QXmlAttributes& attrib);
226     virtual void startGrave(const QXmlAttributes& attrib);
227     virtual void startCirc(const QXmlAttributes& attrib);
228     virtual void startTilde(const QXmlAttributes& attrib);
229     virtual void startSzlig(const QXmlAttributes& attrib);
230     virtual void startCedil(const QXmlAttributes& attrib);
231     virtual void startRing(const QXmlAttributes& attrib);
232     virtual void startNbsp(const QXmlAttributes& attrib);
233     virtual void startCopy(const QXmlAttributes& attrib);
234     virtual void startAnchor(const QXmlAttributes& attrib);
235     virtual void startCopyDoc(const QXmlAttributes& attrib);
236     virtual void startTocList(const QXmlAttributes& attrib);
237
238     ParagraphHandler(IBaseHandler *parent);
239     virtual ~ParagraphHandler();
240
241     // IDocPara
242     virtual Kind kind() const { return DocImpl::Para; }
243     virtual IDocIterator *contents() const;
244
245   private:
246     void addTextNode();
247     IBaseHandler   *m_parent;
248     QList<DocImpl>  m_children;
249     MarkupHandler  *m_markupHandler;
250 };
251
252 class ParagraphIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
253 {
254   public:
255     ParagraphIterator(const ParagraphHandler &handler) : 
256       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
257 };
258
259 //-----------------------------------------------------------------------------
260
261 /*! \brief Node representing a list item.
262  *
263  */
264 class ListItemHandler : public DocListItemImpl, public BaseHandler<ListItemHandler>
265 {
266     friend class ListItemIterator;
267   public:
268     ListItemHandler(IBaseHandler *parent);
269     virtual ~ListItemHandler();
270     virtual void startListItem(const QXmlAttributes& attrib);
271     virtual void endListItem();
272     virtual void startParagraph(const QXmlAttributes& attrib);
273
274     // IDocItem
275     virtual Kind kind() const { return DocImpl::ListItem; }
276     virtual IDocIterator *contents() const;
277
278   private:
279     IBaseHandler   *m_parent;
280     QList<DocImpl>  m_children;
281 };
282
283 class ListItemIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
284 {
285   public:
286     ListItemIterator(const ListItemHandler &handler) : 
287       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
288 };
289
290
291 //-----------------------------------------------------------------------------
292
293 /*! \brief Node representing list of items.
294  *
295  */
296 class OrderedListHandler : public DocOrderedListImpl, public BaseHandler<OrderedListHandler>
297 {
298     friend class OrderedListIterator;
299   public:
300     OrderedListHandler(IBaseHandler *parent);
301     virtual ~OrderedListHandler();
302     virtual void startOrderedList(const QXmlAttributes& attrib);
303     virtual void endOrderedList();
304     virtual void startOrderedListItem(const QXmlAttributes& attrib);
305
306     // IDocOrderedList
307     virtual Kind kind() const { return DocImpl::OrderedList; }
308     virtual IDocIterator *elements() const;
309
310   private:
311     IBaseHandler   *m_parent;
312     QList<DocImpl>  m_children;
313 };
314
315 class OrderedListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
316 {
317   public:
318     OrderedListIterator(const OrderedListHandler &handler) : 
319       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
320 };
321
322 //-----------------------------------------------------------------------------
323
324 /*! \brief Node representing table of contents list.
325  *
326  */
327 class TocListHandler : public DocTocListImpl, public BaseHandler<TocListHandler>
328 {
329     friend class TocListIterator;
330   public:
331     TocListHandler(IBaseHandler *parent);
332     virtual ~TocListHandler();
333     virtual void startTocList(const QXmlAttributes& attrib);
334     virtual void endTocList();
335     virtual void startTocItem(const QXmlAttributes& attrib);
336
337     // IDocTocList
338     virtual Kind kind() const { return DocImpl::TocList; }
339     virtual IDocIterator *elements() const;
340
341   private:
342     IBaseHandler   *m_parent;
343     QList<DocImpl>  m_children;
344 };
345
346 class TocListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
347 {
348   public:
349     TocListIterator(const TocListHandler &handler) : 
350       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
351 };
352
353 //-----------------------------------------------------------------------------
354
355 /*! \brief Node representing a table of contents item.
356  *
357  */
358 class TocItemHandler : public DocTocItemImpl, public BaseHandler<TocItemHandler>
359 {
360     friend class TocItemIterator;
361   public:
362     TocItemHandler(IBaseHandler *parent);
363     virtual ~TocItemHandler();
364     virtual void startTocItem(const QXmlAttributes& attrib);
365     virtual void endTocItem();
366
367     // IDocItem
368     virtual Kind kind() const { return DocImpl::TocItem; }
369     virtual const IString *id() const { return &m_id; }
370     virtual const IString *title() const { return &m_title; }
371
372   private:
373     IBaseHandler   *m_parent;
374     StringImpl      m_id;
375     StringImpl      m_title;
376 };
377
378 //-----------------------------------------------------------------------------
379
380 /*! \brief Node representing list of items.
381  *
382  */
383 class ItemizedListHandler : public DocItemizedListImpl, public BaseHandler<ItemizedListHandler>
384 {
385     friend class ItemizedListIterator;
386   public:
387     ItemizedListHandler(IBaseHandler *parent);
388     virtual ~ItemizedListHandler();
389     virtual void startItemizedList(const QXmlAttributes& attrib);
390     virtual void endItemizedList();
391     virtual void startItemizedListItem(const QXmlAttributes& attrib);
392
393     // IDocItemizedList
394     virtual Kind kind() const { return DocImpl::ItemizedList; }
395     virtual IDocIterator *elements() const;
396
397   private:
398     IBaseHandler   *m_parent;
399     QList<DocImpl>  m_children;
400 };
401
402 class ItemizedListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
403 {
404   public:
405     ItemizedListIterator(const ItemizedListHandler &handler) : 
406       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
407 };
408
409
410 //-----------------------------------------------------------------------------
411 /*! \brief Node representing a parameter.
412  *
413  */
414 class ParameterHandler : public DocParameterImpl, 
415                          public BaseHandler<ParameterHandler>
416 {
417   public:
418     ParameterHandler(IBaseHandler *parent);
419     virtual ~ParameterHandler();
420     virtual void startParameterName(const QXmlAttributes& attrib);
421     virtual void endParameterName();
422
423     // IDocParameter
424     virtual Kind kind() const { return DocImpl::Parameter; }
425     virtual const IString *name() const { return &m_name; }
426
427   private:
428     IBaseHandler     *m_parent;
429     StringImpl        m_name;
430 };
431
432 //-----------------------------------------------------------------------------
433
434 /* \brief Node representing a list of param names with a single description.
435  *
436  */
437 class ParameterItemHandler : public DocParameterItemImpl, 
438                              public BaseHandler<ParameterItemHandler>
439 {
440     friend class ParameterItemIterator;
441   public:
442     ParameterItemHandler(IBaseHandler *parent);
443     virtual ~ParameterItemHandler();
444     virtual void startParameterItem(const QXmlAttributes& attrib);
445     virtual void endParameterItem();
446     virtual void startParameterName(const QXmlAttributes& attrib);
447     virtual void startParagraph(const QXmlAttributes& attrib);
448
449     // IDocParameterItem
450     virtual Kind kind() const { return DocImpl::ParameterItem; }
451     virtual IDocIterator *paramNames() const;
452     virtual IDocPara *description() const { return m_description; }
453
454   private:
455     IBaseHandler            *m_parent;
456     QList<ParameterHandler>  m_parameters;
457     ParagraphHandler *m_description;
458 };
459
460 class ParameterItemIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>
461 {
462   public:
463     ParameterItemIterator(const ParameterItemHandler &handler) : 
464       BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>(handler.m_parameters) {}
465 };
466
467 //-----------------------------------------------------------------------------
468
469 /* \brief Node representing a parameter section.
470  *
471  */
472 class ParameterListHandler : public DocParameterListImpl, 
473                              public BaseHandler<ParameterListHandler>
474 {
475     friend class ParameterListIterator;
476   public:
477     ParameterListHandler(IBaseHandler *parent);
478     virtual ~ParameterListHandler();
479     virtual void startParameterList(const QXmlAttributes& attrib);
480     virtual void endParameterList();
481     virtual void startParameterItem(const QXmlAttributes& attrib);
482
483     // IDocParameterList
484     virtual Kind kind() const { return DocImpl::ParameterList; }
485     virtual Types sectType() const { return m_type; }
486     virtual IDocIterator *params() const;
487
488   private:
489     IBaseHandler            *m_parent;
490     QList<ParameterItemHandler>  m_paramItems;
491     Types                    m_type;
492 };
493
494 class ParameterListIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>
495 {
496   public:
497     ParameterListIterator(const ParameterListHandler &handler) : 
498       BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>(handler.m_paramItems) {}
499 };
500
501 //-----------------------------------------------------------------------------
502
503 /* \brief Node representing a horizontal ruler
504  *
505  */
506 class LineBreakHandler : public DocLineBreakImpl, public BaseHandler<LineBreakHandler>
507 {
508   public:
509     LineBreakHandler(IBaseHandler *parent);
510     virtual ~LineBreakHandler();
511
512     void startLineBreak(const QXmlAttributes& attrib);
513     void endLineBreak();
514
515     // IDocLineBreak
516     virtual Kind kind() const { return DocImpl::LineBreak; }
517
518   private:
519     IBaseHandler   *m_parent;
520 };
521
522 //-----------------------------------------------------------------------------
523
524 /* \brief Node representing a link to section
525  *
526  */
527 class LinkHandler : public DocLinkImpl, public BaseHandler<LinkHandler>
528 {
529   public:
530     LinkHandler(IBaseHandler *parent);
531     virtual ~LinkHandler();
532
533     void startLink(const QXmlAttributes& attrib);
534     void endLink();
535
536     // IDocLink
537     virtual Kind kind() const { return DocImpl::Link; }
538     virtual const IString *refId() const { return &m_ref; }
539     virtual const IString *text() const { return &m_text; }
540
541   private:
542     IBaseHandler   *m_parent;
543     StringImpl      m_ref;
544     StringImpl      m_text;
545 };
546
547
548 //-----------------------------------------------------------------------------
549
550 /* \brief Node representing a link to an email address
551  *
552  */
553 class EMailHandler : public DocEMailImpl, public BaseHandler<EMailHandler>
554 {
555   public:
556     EMailHandler(IBaseHandler *parent);
557     virtual ~EMailHandler();
558
559     void startEMail(const QXmlAttributes& attrib);
560     void endEMail();
561
562     // IDocEMail
563     virtual Kind kind() const { return DocImpl::EMail; }
564     virtual const IString *address() const { return &m_address; }
565
566   private:
567     IBaseHandler   *m_parent;
568     StringImpl      m_address;
569 };
570
571
572 //-----------------------------------------------------------------------------
573
574 /* \brief Node representing a link to an URL
575  *
576  */
577 class ULinkHandler : public DocULinkImpl, public BaseHandler<ULinkHandler>
578 {
579   public:
580     ULinkHandler(IBaseHandler *parent);
581     virtual ~ULinkHandler();
582
583     void startULink(const QXmlAttributes& attrib);
584     void endULink();
585
586     // IDocULink
587     virtual Kind kind() const { return DocImpl::ULink; }
588     virtual const IString * url() const { return &m_url; }
589     virtual const IString * text() const { return &m_text; }
590
591   private:
592     IBaseHandler   *m_parent;
593     StringImpl      m_url;
594     StringImpl      m_text;
595 };
596
597 //-----------------------------------------------------------------------------
598
599 /* \brief Node representing a horizontal ruler
600  *
601  */
602 class HRulerHandler : public DocHRulerImpl, public BaseHandler<HRulerHandler>
603 {
604   public:
605     HRulerHandler(IBaseHandler *parent);
606     virtual ~HRulerHandler();
607
608     void startHRuler(const QXmlAttributes& attrib);
609     void endHRuler();
610
611     // IDocHRuler
612     virtual Kind kind() const { return DocImpl::HRuler; }
613
614   private:
615     IBaseHandler   *m_parent;
616 };
617
618 //-----------------------------------------------------------------------------
619
620 /* \brief Node representing a reference to another item
621  *
622  */
623 class RefHandler : public DocRefImpl, public BaseHandler<RefHandler>
624 {
625   public:
626     RefHandler(IBaseHandler *parent);
627     virtual ~RefHandler();
628     void startRef(const QXmlAttributes& attrib);
629     void endRef();
630
631     // IDocRef
632     virtual Kind kind() const { return DocImpl::Ref; }
633     virtual const IString *refId() const { return &m_refId; }
634     virtual TargetKind targetKind() const { return m_targetKind; }
635     virtual const IString *external() const { return &m_extId; }
636     virtual const IString *text() const { return &m_linkText; }
637
638   private:
639     IBaseHandler   *m_parent;
640     StringImpl      m_refId;
641     StringImpl      m_extId;
642     StringImpl      m_linkText;
643     TargetKind      m_targetKind;
644 };
645
646 //-----------------------------------------------------------------------------
647
648 /* \brief Node representing the title of a section
649  *
650  */
651 // children: text, ref
652 // children handled by MarkupHandler: 
653 //           bold, computeroutput, emphasis, center,
654 //           small, subscript, superscript. 
655 class TitleHandler : public DocTitleImpl, public BaseHandler<TitleHandler>
656 {
657     friend class TitleIterator;
658   public:
659     TitleHandler(IBaseHandler *parent);
660     virtual ~TitleHandler();
661     virtual void startTitle(const QXmlAttributes& attrib);
662     virtual void endTitle();
663     virtual void startRef(const QXmlAttributes& attrib);
664     void addTextNode();
665
666     // IDocTitle
667     virtual Kind kind() const { return DocImpl::Title; }
668     virtual IDocIterator *title() const;
669
670   private:
671     IBaseHandler   *m_parent;
672     QList<DocImpl>  m_children;
673     MarkupHandler  *m_markupHandler;
674 };
675
676 class TitleIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
677 {
678   public:
679     TitleIterator(const TitleHandler &handler) : 
680       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
681 };
682
683 //-----------------------------------------------------------------------------
684
685 /* \brief Node representing a simple section with an unnumbered header.
686  *
687  */
688 // children: title, para
689 class SimpleSectHandler : public DocSimpleSectImpl, 
690                           public BaseHandler<SimpleSectHandler>
691 {
692   public:
693     SimpleSectHandler(IBaseHandler *parent);
694     virtual ~SimpleSectHandler();
695     virtual void startSimpleSect(const QXmlAttributes& attrib);
696     virtual void endSimpleSect();
697     virtual void startTitle(const QXmlAttributes& attrib);
698     virtual void startParagraph(const QXmlAttributes& attrib);
699
700     // IDocSimpleSect
701     virtual Kind kind() const { return DocImpl::SimpleSect; }
702     virtual Types type() const { return m_type; }
703     virtual const IString *typeString() const { return &m_typeString; }
704     virtual IDocTitle *title() const { return m_title; }
705     virtual IDocPara *description() const { return m_paragraph; }
706
707   private:
708     IBaseHandler            *m_parent;
709     ParagraphHandler        *m_paragraph;
710     Types                    m_type;
711     StringImpl               m_typeString;
712     TitleHandler            *m_title;
713 };
714
715 //-----------------------------------------------------------------------------
716
717 /* \brief Node representing an named item of a VariableList.
718  *
719  */
720 class VariableListEntryHandler : public DocVariableListEntryImpl, 
721                                  public BaseHandler<VariableListEntryHandler>
722 {
723   public:
724     virtual void startVarListEntry(const QXmlAttributes& attrib);
725     virtual void endVarListEntry();
726     virtual void startListItem(const QXmlAttributes& attrib);
727     virtual void endListItem();
728     virtual void startTerm(const QXmlAttributes& attrib);
729     virtual void endTerm();
730     virtual void startParagraph(const QXmlAttributes& attrib);
731
732     VariableListEntryHandler(IBaseHandler *parent);
733     virtual ~VariableListEntryHandler();
734
735     // IDocVariableListEntry
736     virtual Kind kind() const { return DocImpl::VariableListEntry; }
737     virtual ILinkedTextIterator *term() const;
738     virtual IDocPara *description() const { return m_description; }
739
740   private:
741     IBaseHandler*         m_parent;
742     QList<LinkedTextImpl> m_term;
743     ParagraphHandler*     m_description;
744     LinkedTextHandler*    m_linkedTextHandler;
745 };
746
747 //-----------------------------------------------------------------------------
748
749 /*! \brief Node representing a list of named items.
750  *
751  */
752 // children: varlistentry, listitem
753 class VariableListHandler : public DocVariableListImpl, 
754                             public BaseHandler<VariableListHandler>
755 {
756     friend class VariableListIterator;
757     
758   public:
759     virtual void startVariableList(const QXmlAttributes& attrib);
760     virtual void endVariableList();
761     virtual void startVarListEntry(const QXmlAttributes& attrib);
762     virtual void startListItem(const QXmlAttributes& attrib);
763     
764     VariableListHandler(IBaseHandler *parent);
765     virtual ~VariableListHandler();
766
767     // IDocVariableList
768     virtual Kind kind() const { return DocImpl::VariableList; }
769     virtual IDocIterator *entries() const;
770
771   private:
772     IBaseHandler   *m_parent;
773     QList<VariableListEntryHandler> m_entries;
774     VariableListEntryHandler *m_curEntry;
775 };
776
777 class VariableListIterator : public BaseIteratorVia<IDocIterator,IDoc,VariableListEntryHandler,DocImpl>
778 {
779   public:
780     VariableListIterator(const VariableListHandler &handler) : 
781       BaseIteratorVia<IDocIterator,IDoc,VariableListEntryHandler,DocImpl>(handler.m_entries) {}
782 };
783
784 //-----------------------------------------------------------------------------
785
786 /*! \brief Node representing a highlighted text fragment.
787  *
788  */
789 // children: ref
790 class HighlightHandler : public DocHighlightImpl, public BaseHandler<HighlightHandler>
791 {
792     friend class HighlightIterator;
793   public:
794     HighlightHandler(IBaseHandler *parent);
795     virtual ~HighlightHandler();
796     void startHighlight(const QXmlAttributes& attrib);
797     void endHighlight();
798     virtual void startRef(const QXmlAttributes&);
799     virtual void startSpace(const QXmlAttributes&);
800
801     // IDocHighlight
802     virtual Kind kind() const { return DocImpl::Highlight; }
803     virtual HighlightKind highlightKind() const { return m_hl; }
804     virtual IDocIterator *codeElements() const;
805
806   private:
807     void addTextNode();
808     
809     IBaseHandler   *m_parent;
810     HighlightKind  m_hl;
811     QString        m_hlString;
812     QList<DocImpl> m_children;
813 };
814
815 class HighlightIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
816 {
817   public:
818     HighlightIterator(const HighlightHandler &handler) : 
819       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
820 };
821
822 //-----------------------------------------------------------------------------
823
824 /*! \brief Node representing a line of code.
825  *
826  */
827 // children: linenumber, highlight, anchor, ref
828 class CodeLineHandler : public DocCodeLineImpl, public BaseHandler<CodeLineHandler>
829 {
830     friend class CodeLineIterator;
831   public:
832
833     virtual void startCodeLine(const QXmlAttributes&);
834     virtual void endCodeLine();
835     virtual void startLineNumber(const QXmlAttributes&);
836     virtual void endLineNumber();
837     virtual void startHighlight(const QXmlAttributes&);
838     virtual void startRef(const QXmlAttributes&);
839     
840     CodeLineHandler(IBaseHandler *parent);
841     virtual ~CodeLineHandler();
842
843     // IDocCodeLine
844     virtual Kind kind() const { return DocImpl::CodeLine; }
845     virtual int lineNumber() const { return m_lineNumber; }
846     virtual const IString *refId() const { return &m_refId; }
847     virtual IDocIterator *codeElements() const;
848
849   private:
850     void addTextNode();
851
852     IBaseHandler   *m_parent;
853     int            m_lineNumber;
854     StringImpl     m_refId;
855     QList<DocImpl> m_children;
856 };
857
858 class CodeLineIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
859 {
860   public:
861     CodeLineIterator(const CodeLineHandler &handler) : 
862       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
863 };
864
865 //-----------------------------------------------------------------------------
866
867 /*! \brief Node representing a program listing
868  *
869  */
870 // children: codeline, linenumber
871 class ProgramListingHandler : public DocProgramListingImpl, public BaseHandler<ProgramListingHandler>
872 {
873     friend class ProgramListingIterator;
874   public:
875     virtual void startProgramListing(const QXmlAttributes& attrib);
876     virtual void endProgramListing();
877     virtual void startCodeLine(const QXmlAttributes&);
878     virtual void startLineNumber(const QXmlAttributes&);
879
880     ProgramListingHandler(IBaseHandler *parent);
881     virtual ~ProgramListingHandler();
882
883     // IDocProgramListing
884     virtual Kind kind() const { return DocImpl::ProgramListing; }
885     virtual IDocIterator *codeLines() const;
886
887   private:
888     IBaseHandler           *m_parent;
889     QList<CodeLineHandler>  m_children;
890     bool m_hasLineNumber;
891 };
892
893 //-----------------------------------------------------------------------------
894
895 class ProgramListingIterator : public BaseIteratorVia<IDocIterator,IDoc,CodeLineHandler,DocImpl>
896 {
897   public:
898     ProgramListingIterator(const ProgramListingHandler &handler) : 
899       BaseIteratorVia<IDocIterator,IDoc,CodeLineHandler,DocImpl>(handler.m_children) {}
900 };
901
902 //-----------------------------------------------------------------------------
903
904 /*! \brief Node representing a formula.
905  *
906  */
907 // children: -
908 class FormulaHandler : public DocFormulaImpl, public BaseHandler<FormulaHandler>
909 {
910   public:
911     FormulaHandler(IBaseHandler *parent);
912     virtual ~FormulaHandler();
913     void startFormula(const QXmlAttributes& attrib);
914     void endFormula();
915
916     // IDocFormula
917     virtual Kind kind() const { return DocImpl::Formula; }
918     virtual const IString *id() const { return &m_id; }
919     virtual const IString *text() const { return &m_text; }
920
921   private:
922     IBaseHandler  *m_parent;
923     StringImpl     m_id;
924     StringImpl     m_text;
925 };
926
927 //-----------------------------------------------------------------------------
928
929 /*! \brief Node representing an image.
930  *
931  */
932 // children: -
933 class ImageHandler : public DocImageImpl, public BaseHandler<ImageHandler>
934 {
935   public:
936     ImageHandler(IBaseHandler *parent);
937     virtual ~ImageHandler();
938     void startImage(const QXmlAttributes& attrib);
939     void endImage();
940
941     // IDocImage
942     virtual Kind kind() const { return DocImpl::Image; }
943     virtual const IString *name() const { return &m_name; }
944     virtual const IString *caption() const { return &m_caption; }
945
946   private:
947     IBaseHandler  *m_parent;
948     StringImpl     m_name;
949     StringImpl     m_caption;
950 };
951
952
953 //-----------------------------------------------------------------------------
954 /*! \brief Node representing an anchor.
955  *
956  */
957 // children: -
958 class AnchorHandler : public DocAnchorImpl, public BaseHandler<AnchorHandler>
959 {
960   public:
961     AnchorHandler(IBaseHandler *parent);
962     virtual ~AnchorHandler();
963     void startAnchor(const QXmlAttributes& attrib);
964     void endAnchor();
965
966     // IDocAnchor
967     virtual Kind kind() const { return DocImpl::Anchor; }
968     virtual const IString *id() const { return &m_id; }
969
970   private:
971     IBaseHandler  *m_parent;
972     StringImpl     m_id;
973 };
974
975 //-----------------------------------------------------------------------------
976
977 /*! \brief Node representing a dot file.
978  *
979  */
980 // children: -
981 class DotFileHandler : public DocDotFileImpl, public BaseHandler<DotFileHandler>
982 {
983   public:
984     DotFileHandler(IBaseHandler *parent);
985     virtual ~DotFileHandler();
986     void startDotFile(const QXmlAttributes& attrib);
987     void endDotFile();
988
989     // IDocDotFile
990     virtual Kind kind() const { return DocImpl::DotFile; }
991     virtual const IString *name() const { return &m_name; }
992     virtual const IString *caption() const { return &m_caption; }
993
994   private:
995     IBaseHandler  *m_parent;
996     StringImpl     m_name;
997     StringImpl     m_caption;
998 };
999
1000 //-----------------------------------------------------------------------------
1001
1002 /*! \brief Node representing an entry in the index.
1003  *
1004  */
1005 // children: -
1006 class IndexEntryHandler : public DocIndexEntryImpl, public BaseHandler<IndexEntryHandler>
1007 {
1008   public:
1009     IndexEntryHandler(IBaseHandler *parent);
1010     virtual ~IndexEntryHandler();
1011     void startIndexEntry(const QXmlAttributes& attrib);
1012     void endIndexEntry();
1013     void startPrimaryIE(const QXmlAttributes& attrib);
1014     void endPrimaryIE();
1015     void startSecondaryIE(const QXmlAttributes& attrib);
1016     void endSecondaryIE();
1017
1018     // IDocIndexEntry
1019     virtual Kind kind() const { return DocImpl::IndexEntry; }
1020     virtual const IString *primary() const { return &m_primary; }
1021     virtual const IString *secondary() const { return &m_secondary; }
1022
1023   private:
1024     IBaseHandler  *m_parent;
1025     StringImpl     m_primary;
1026     StringImpl     m_secondary;
1027 };
1028
1029 //-----------------------------------------------------------------------------
1030
1031 /*! \brief Node representing an entry in the table entry.
1032  *
1033  */
1034 // children: para
1035 class EntryHandler : public DocEntryImpl, public BaseHandler<EntryHandler>
1036 {
1037     friend class EntryIterator;
1038   public:
1039     EntryHandler(IBaseHandler *parent);
1040     virtual ~EntryHandler();
1041     void startEntry(const QXmlAttributes& attrib);
1042     void endEntry();
1043     void startParagraph(const QXmlAttributes& attrib);
1044
1045     // IDocEntry
1046     virtual Kind kind() const { return DocImpl::Entry; }
1047     virtual IDocIterator *contents() const;
1048
1049   private:
1050     IBaseHandler   *m_parent;
1051     QList<DocImpl>  m_children;
1052 };
1053
1054 class EntryIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
1055 {
1056   public:
1057     EntryIterator(const EntryHandler &handler) : 
1058       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
1059 };
1060
1061 //-----------------------------------------------------------------------------
1062
1063 /*! \brief Node representing an entry in the table row.
1064  *
1065  */
1066 // children: entry
1067 class RowHandler : public DocRowImpl, public BaseHandler<RowHandler>
1068 {
1069     friend class RowIterator;
1070   public:
1071     RowHandler(IBaseHandler *parent);
1072     virtual ~RowHandler();
1073     void startRow(const QXmlAttributes& attrib);
1074     void endRow();
1075     void startEntry(const QXmlAttributes& attrib);
1076
1077     // IDocRow
1078     virtual Kind kind() const { return DocImpl::Row; }
1079     virtual IDocIterator *entries() const;
1080
1081   private:
1082     IBaseHandler        *m_parent;
1083     QList<EntryHandler>  m_children;
1084 };
1085
1086 class RowIterator : public BaseIteratorVia<IDocIterator,IDoc,EntryHandler,DocImpl>
1087 {
1088   public:
1089     RowIterator(const RowHandler &handler) : 
1090       BaseIteratorVia<IDocIterator,IDoc,EntryHandler,DocImpl>(handler.m_children) {}
1091 };
1092
1093 //-----------------------------------------------------------------------------
1094
1095 /*! \brief Node representing an entry in the table.
1096  *
1097  */
1098 // children: row, caption
1099 class TableHandler : public DocTableImpl, public BaseHandler<TableHandler>
1100 {
1101     friend class TableIterator;
1102   public:
1103     TableHandler(IBaseHandler *parent);
1104     virtual ~TableHandler();
1105     void startTable(const QXmlAttributes& attrib);
1106     void endTable();
1107     void startRow(const QXmlAttributes& attrib);
1108     void startCaption(const QXmlAttributes& attrib);
1109     void endCaption();
1110
1111     // IDocTable
1112     virtual Kind kind() const { return DocImpl::Table; }
1113     virtual IDocIterator *rows() const;
1114     virtual int numColumns() const { return m_numColumns; }
1115     virtual const IString *caption() const { return &m_caption; }
1116
1117   private:
1118     IBaseHandler      *m_parent;
1119     QList<RowHandler>  m_children;
1120     int                m_numColumns;
1121     StringImpl         m_caption;
1122 };
1123
1124 class TableIterator : public BaseIteratorVia<IDocIterator,IDoc,RowHandler,DocImpl>
1125 {
1126   public:
1127     TableIterator(const TableHandler &handler) : 
1128       BaseIteratorVia<IDocIterator,IDoc,RowHandler,DocImpl>(handler.m_children) {}
1129 };
1130
1131 //-----------------------------------------------------------------------------
1132
1133 /*! \brief Node representing a copied piece of documentation.
1134  *
1135  */
1136 class CopyHandler : public DocCopyImpl, public BaseHandler<CopyHandler>
1137 {
1138     friend class CopyIterator;
1139   public:
1140     CopyHandler(IBaseHandler *parent);
1141     virtual ~CopyHandler();
1142     virtual void startCopy(const QXmlAttributes& attrib);
1143     virtual void endCopy();
1144     virtual void startParagraph(const QXmlAttributes& attrib);
1145
1146     // IDocCopy
1147     virtual Kind kind() const { return DocImpl::Copy; }
1148     virtual IDocIterator *contents() const;
1149
1150   private:
1151     IBaseHandler   *m_parent;
1152     QList<DocImpl>  m_children;
1153 };
1154
1155 class CopyIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
1156 {
1157   public:
1158     CopyIterator(const CopyHandler &handler) : 
1159       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
1160 };
1161
1162 //-----------------------------------------------------------------------------
1163
1164 /*! \brief Node representing an preformatted section
1165  */
1166 class VerbatimHandler : public DocVerbatimImpl, 
1167                         public BaseHandler<VerbatimHandler>
1168 {
1169   public:
1170     VerbatimHandler(IBaseHandler *parent);
1171     virtual ~VerbatimHandler();
1172     void startVerbatim(const QXmlAttributes& attrib,Types type);
1173     void endVerbatim();
1174
1175     // IDocVerbatim
1176     virtual Kind kind() const { return DocImpl::Verbatim; }
1177     virtual const IString *text() const { return &m_text; }
1178     virtual Types type() const { return m_type; }
1179
1180   private:
1181     IBaseHandler *m_parent;
1182     StringImpl    m_text;
1183     Types         m_type;
1184 };
1185
1186
1187 //-----------------------------------------------------------------------------
1188
1189 /*! \brief Node representing an special symbol.
1190  *
1191  */
1192 // children: -
1193 class SymbolHandler : public DocSymbolImpl, public BaseHandler<SymbolHandler>
1194 {
1195   public:
1196     SymbolHandler(IBaseHandler *parent,Types type);
1197     virtual ~SymbolHandler();
1198     void startSymbol(const QXmlAttributes& attrib);
1199     void endSymbol();
1200
1201     // IDocSymbol
1202     virtual Kind kind() const   { return DocImpl::Symbol; }
1203     virtual Types type() const  { return m_type; }
1204     virtual const IString *typeString() const { return &m_typeString; }
1205     virtual char letter() const { return m_letter; }
1206
1207   private:
1208     IBaseHandler  *m_parent;
1209     char           m_letter;
1210     Types          m_type;
1211     StringImpl     m_typeString;
1212 };
1213
1214
1215 //-----------------------------------------------------------------------------
1216
1217 /*! \brief Node representing a section.
1218  *
1219  */
1220 // children: title, para, sect(n+1)
1221 class DocSectionHandler : public DocSectionImpl, public BaseHandler<DocSectionHandler>
1222 {
1223     friend class DocSectionParaIterator;
1224     friend class DocSectionSubIterator;
1225   public:
1226     DocSectionHandler(IBaseHandler *parent,int level);
1227     virtual ~DocSectionHandler();
1228     virtual void startDocSection(const QXmlAttributes& attrib);
1229     virtual void endDocSection();
1230     virtual void startTitle(const QXmlAttributes& attrib);
1231     virtual void startSubSection(const QXmlAttributes& attrib);
1232     virtual void startParagraph(const QXmlAttributes& attrib);
1233     virtual void startInternal(const QXmlAttributes& attrib);
1234
1235     // IDocSection
1236     virtual Kind kind() const { return DocImpl::Section; }
1237     virtual const IString *id() const { return &m_id; }
1238     virtual int level() const { return m_level; }
1239     virtual IDocTitle *title() const { return m_title; }
1240     virtual IDocIterator *paragraphs() const;
1241     virtual IDocIterator *subSections() const;
1242     virtual IDocInternal *internal() const;
1243
1244   private:
1245     IBaseHandler    *m_parent;
1246     QList<DocImpl>   m_paragraphs;
1247     QList<DocImpl>   m_subsections;
1248     DocInternalHandler *m_internal;
1249     StringImpl       m_id;
1250     int              m_level;
1251     TitleHandler    *m_title;
1252 };
1253
1254 class DocSectionParaIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
1255 {
1256   public:
1257     DocSectionParaIterator(const DocSectionHandler &handler) : 
1258       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_paragraphs) {}
1259 };
1260
1261 class DocSectionSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
1262 {
1263   public:
1264     DocSectionSubIterator(const DocSectionHandler &handler) : 
1265       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_subsections) {}
1266 };
1267
1268 //-----------------------------------------------------------------------------
1269
1270 class DocInternalHandler : public DocInternalImpl, public BaseHandler<DocInternalHandler>
1271 {
1272   public:
1273     friend class DocInternalParaIterator;
1274     friend class DocInternalSubIterator;
1275     DocInternalHandler(IBaseHandler *parent,int level);
1276     virtual ~DocInternalHandler();
1277     virtual void startInternal(const QXmlAttributes& attrib);
1278     virtual void endInternal();
1279     virtual void startSubSection(const QXmlAttributes& attrib);
1280     virtual void startParagraph(const QXmlAttributes& attrib);
1281
1282     // IDocInternal
1283     virtual Kind kind() const { return DocImpl::Internal; }
1284     virtual IDocIterator *paragraphs() const;
1285     virtual IDocIterator *subSections() const;
1286
1287   private:
1288     IBaseHandler    *m_parent;
1289     QList<DocImpl>   m_paragraphs;
1290     QList<DocImpl>   m_subsections;
1291     int              m_level;
1292 };
1293
1294 class DocInternalParaIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
1295 {
1296   public:
1297     DocInternalParaIterator(const DocInternalHandler &handler) : 
1298       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_paragraphs) {}
1299 };
1300
1301 class DocInternalSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
1302 {
1303   public:
1304     DocInternalSubIterator(const DocInternalHandler &handler) : 
1305       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_subsections) {}
1306 };
1307
1308
1309 //-----------------------------------------------------------------------------
1310
1311 /*! \brief Node representing a documentation block.
1312  *
1313  */
1314 // children: para, title, sect1, internal
1315 class DocHandler : public DocRootImpl, public BaseHandler<DocHandler>
1316 {
1317     friend class DocIterator;
1318   public:
1319     virtual void startDoc(const QXmlAttributes& attrib);
1320     virtual void endDoc();
1321     virtual void startParagraph(const QXmlAttributes& attrib);
1322     virtual void startSect1(const QXmlAttributes& attrib);
1323     virtual void startTitle(const QXmlAttributes& attrib);
1324     virtual void startInternal(const QXmlAttributes& attrib);
1325
1326     DocHandler(IBaseHandler *parent);
1327     virtual ~DocHandler();
1328     
1329     // IDocRoot
1330     virtual Kind kind() const { return DocImpl::Root; }
1331     virtual IDocIterator *contents() const;
1332     virtual IDocInternal *internal() const;
1333
1334   private:
1335     IBaseHandler *m_parent;
1336     QList<DocImpl> m_children;
1337     DocInternalHandler *m_internal;
1338 };
1339
1340 class DocIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
1341 {
1342   public:
1343     DocIterator(const DocHandler &handler) : 
1344       BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
1345 };
1346
1347 //-----------------------------------------------------------------------------
1348
1349 void dochandler_init();
1350 void dochandler_exit();
1351
1352 #endif