My Project
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
rtfdocvisitor.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  *
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  * Documents produced by Doxygen are derivative works derived from the
15  * input used in their production; they are not affected by this license.
16  *
17  */
18 
19 #include <qfileinfo.h>
20 
21 #include "rtfdocvisitor.h"
22 #include "docparser.h"
23 #include "language.h"
24 #include "doxygen.h"
25 #include "outputgen.h"
26 #include "dot.h"
27 #include "msc.h"
28 #include "util.h"
29 #include "rtfstyle.h"
30 #include "message.h"
31 #include "parserintf.h"
32 #include "msc.h"
33 #include "dia.h"
34 #include "filedef.h"
35 #include "config.h"
36 #include "htmlentity.h"
37 #include "plantuml.h"
38 
39 //#define DBG_RTF(x) m_t << x
40 #define DBG_RTF(x) do {} while(0)
41 
42 static QCString align(DocHtmlCell *cell)
43 {
44  HtmlAttribList attrs = cell->attribs();
45  uint i;
46  for (i=0; i<attrs.count(); ++i)
47  {
48  if (attrs.at(i)->name.lower()=="align")
49  {
50  if (attrs.at(i)->value.lower()=="center")
51  return "\\qc ";
52  else if (attrs.at(i)->value.lower()=="right")
53  return "\\qr ";
54  else return "";
55  }
56  }
57  return "";
58 }
59 
61  const char *langExt)
62  : DocVisitor(DocVisitor_RTF), m_t(t), m_ci(ci), m_insidePre(FALSE),
63  m_hide(FALSE), m_indentLevel(0), m_lastIsPara(FALSE), m_langExt(langExt)
64 {
65 }
66 
67 QCString RTFDocVisitor::getStyle(const char *name)
68 {
69  QCString n;
70  n.sprintf("%s%d",name,m_indentLevel);
71  StyleData *sd = rtf_Style[n];
72  ASSERT(sd!=0);
73  return sd->reference;
74 }
75 
77 {
79 }
80 
82 {
84 }
85 
86  //--------------------------------------
87  // visitor functions for leaf nodes
88  //--------------------------------------
89 
91 {
92  if (m_hide) return;
93  DBG_RTF("{\\comment RTFDocVisitor::visit(DocWord)}\n");
94  filter(w->word());
95  m_lastIsPara=FALSE;
96 }
97 
99 {
100  if (m_hide) return;
101  DBG_RTF("{\\comment RTFDocVisitor::visit(DocLinkedWord)}\n");
102  startLink(w->ref(),w->file(),w->anchor());
103  filter(w->word());
104  endLink(w->ref());
105  m_lastIsPara=FALSE;
106 }
107 
109 {
110  if (m_hide) return;
111  DBG_RTF("{\\comment RTFDocVisitor::visit(DocWhiteSpace)}\n");
112  if (m_insidePre)
113  {
114  m_t << w->chars();
115  }
116  else
117  {
118  m_t << " ";
119  }
120  m_lastIsPara=FALSE;
121 }
122 
124 {
125  if (m_hide) return;
126  DBG_RTF("{\\comment RTFDocVisitor::visit(DocSymbol)}\n");
127  const char *res = HtmlEntityMapper::instance()->rtf(s->symbol());
128  if (res)
129  {
130  m_t << res;
131  }
132  else
133  {
134  err("RTF: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
135  }
136  m_lastIsPara=FALSE;
137 }
138 
140 {
141  if (m_hide) return;
142  DBG_RTF("{\\comment RTFDocVisitor::visit(DocURL)}\n");
143  if (Config_getBool(RTF_HYPERLINKS))
144  {
145  m_t << "{\\field "
146  "{\\*\\fldinst "
147  "{ HYPERLINK \"";
148  if (u->isEmail()) m_t << "mailto:";
149  m_t << u->url();
150  m_t << "\" }"
151  "{}";
152  m_t << "}"
153  "{\\fldrslt "
154  "{\\cs37\\ul\\cf2 ";
155  filter(u->url());
156  m_t << "}"
157  "}"
158  "}" << endl;
159  }
160  else
161  {
162  m_t << "{\\f2 ";
163  filter(u->url());
164  m_t << "}";
165  }
166  m_lastIsPara=FALSE;
167 }
168 
170 {
171  if (m_hide) return;
172  DBG_RTF("{\\comment RTFDocVisitor::visit(DocLineBreak)}\n");
173  m_t << "\\par" << endl;
174  m_lastIsPara=TRUE;
175 }
176 
178 {
179  if (m_hide) return;
180  DBG_RTF("{\\comment RTFDocVisitor::visit(DocHorRuler)}\n");
181  m_t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
182  m_lastIsPara=TRUE;
183 }
184 
186 {
187  if (m_hide) return;
188  m_lastIsPara=FALSE;
189  DBG_RTF("{\\comment RTFDocVisitor::visit(DocStyleChange)}\n");
190  switch (s->style())
191  {
193  if (s->enable()) m_t << "{\\b "; else m_t << "} ";
194  break;
196  if (s->enable()) m_t << "{\\i "; else m_t << "} ";
197  break;
199  if (s->enable()) m_t << "{\\f2 "; else m_t << "} ";
200  break;
202  if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
203  break;
205  if (s->enable()) m_t << "{\\super "; else m_t << "} ";
206  break;
208  if (s->enable()) m_t << "{\\qc "; else m_t << "} ";
209  break;
211  if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
212  break;
214  if (s->enable())
215  {
216  m_t << "{" << endl;
217  m_t << "\\par" << endl;
218  m_t << rtf_Style_Reset << getStyle("CodeExample");
219  m_insidePre=TRUE;
220  }
221  else
222  {
223  m_insidePre=FALSE;
224  m_t << "\\par";
225  m_t << "}" << endl;
226  }
227  m_lastIsPara=TRUE;
228  break;
229  case DocStyleChange::Div: /* HTML only */ break;
230  case DocStyleChange::Span: /* HTML only */ break;
231  }
232 }
233 
234 static void visitCaption(RTFDocVisitor *parent, QList<DocNode> children)
235 {
236  QListIterator<DocNode> cli(children);
237  DocNode *n;
238  for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
239 }
240 
242 {
243  if (m_hide) return;
244  DBG_RTF("{\\comment RTFDocVisitor::visit(DocVerbatim)}\n");
245  QCString lang = m_langExt;
246  if (!s->language().isEmpty()) // explicit language setting
247  {
248  lang = s->language();
249  }
250  SrcLangExt langExt = getLanguageFromFileName(lang);
251  switch(s->type())
252  {
253  case DocVerbatim::Code: // fall though
254  m_t << "{" << endl;
255  m_t << "\\par" << endl;
256  m_t << rtf_Style_Reset << getStyle("CodeExample");
258  ->parseCode(m_ci,s->context(),s->text(),langExt,
259  s->isExample(),s->exampleFile());
260  //m_t << "\\par" << endl;
261  m_t << "}" << endl;
262  break;
263  case DocVerbatim::Verbatim:
264  m_t << "{" << endl;
265  m_t << "\\par" << endl;
266  m_t << rtf_Style_Reset << getStyle("CodeExample");
267  filter(s->text(),TRUE);
268  //m_t << "\\par" << endl;
269  m_t << "}" << endl;
270  break;
271  case DocVerbatim::RtfOnly:
272  m_t << s->text();
273  break;
274  case DocVerbatim::HtmlOnly:
276  case DocVerbatim::XmlOnly:
279  /* nothing */
280  break;
281  case DocVerbatim::Dot:
282  {
283  static int dotindex = 1;
284  QCString fileName(4096);
285 
286  fileName.sprintf("%s%d%s",
287  (Config_getString(RTF_OUTPUT)+"/inline_dotgraph_").data(),
288  dotindex++,
289  ".dot"
290  );
291  QFile file(fileName);
292  if (!file.open(IO_WriteOnly))
293  {
294  err("Could not open file %s for writing\n",fileName.data());
295  }
296  file.writeBlock( s->text(), s->text().length() );
297  file.close();
298 
299  writeDotFile(fileName, s->hasCaption());
300  visitCaption(this, s->children());
301  includePicturePostRTF(true, s->hasCaption());
302 
303  if (Config_getBool(DOT_CLEANUP)) file.remove();
304  }
305  break;
306  case DocVerbatim::Msc:
307  {
308  static int mscindex = 1;
309  QCString baseName(4096);
310 
311  baseName.sprintf("%s%d%s",
312  (Config_getString(RTF_OUTPUT)+"/inline_mscgraph_").data(),
313  mscindex++,
314  ".msc"
315  );
316  QFile file(baseName);
317  if (!file.open(IO_WriteOnly))
318  {
319  err("Could not open file %s for writing\n",baseName.data());
320  }
321  QCString text = "msc {";
322  text+=s->text();
323  text+="}";
324  file.writeBlock( text, text.length() );
325  file.close();
326 
327  writeMscFile(baseName, s->hasCaption());
328  visitCaption(this, s->children());
329  includePicturePostRTF(true, s->hasCaption());
330 
331  if (Config_getBool(DOT_CLEANUP)) file.remove();
332  }
333  break;
335  {
336  static QCString rtfOutput = Config_getString(RTF_OUTPUT);
337  QCString baseName = writePlantUMLSource(rtfOutput,s->exampleFile(),s->text());
338 
339  writePlantUMLFile(baseName, s->hasCaption());
340  visitCaption(this, s->children());
341  includePicturePostRTF(true, s->hasCaption());
342  }
343  break;
344  }
345  m_lastIsPara=FALSE;
346 }
347 
349 {
350  if (m_hide) return;
351  DBG_RTF("{\\comment RTFDocVisitor::visit(DocAnchor)}\n");
352  QCString anchor;
353  if (!anc->file().isEmpty())
354  {
355  anchor+=anc->file();
356  }
357  if (!anc->file().isEmpty() && !anc->anchor().isEmpty())
358  {
359  anchor+="_";
360  }
361  if (!anc->anchor().isEmpty())
362  {
363  anchor+=anc->anchor();
364  }
365  m_t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl;
366  m_t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}" << endl;
367  m_lastIsPara=FALSE;
368 }
369 
371 {
372  if (m_hide) return;
373  SrcLangExt langExt = getLanguageFromFileName(inc->extension());
374  DBG_RTF("{\\comment RTFDocVisitor::visit(DocInclude)}\n");
375  switch(inc->type())
376  {
378  {
379  m_t << "{" << endl;
380  m_t << "\\par" << endl;
381  m_t << rtf_Style_Reset << getStyle("CodeExample");
382  QFileInfo cfi( inc->file() );
383  FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
385  ->parseCode(m_ci,inc->context(),
386  inc->text(),
387  langExt,
388  inc->isExample(),
389  inc->exampleFile(),
390  &fd, // fileDef,
391  -1, // start line
392  -1, // end line
393  FALSE, // inline fragment
394  0, // memberDef
395  TRUE // show line numbers
396  );
397  m_t << "\\par";
398  m_t << "}" << endl;
399  }
400  break;
401  case DocInclude::Include:
402  m_t << "{" << endl;
403  m_t << "\\par" << endl;
404  m_t << rtf_Style_Reset << getStyle("CodeExample");
406  ->parseCode(m_ci,inc->context(),
407  inc->text(),langExt,inc->isExample(),
408  inc->exampleFile(),
409  0, // fileDef
410  -1, // startLine
411  -1, // endLine
412  TRUE, // inlineFragment
413  0, // memberDef
414  FALSE // show line numbers
415  );
416  m_t << "\\par";
417  m_t << "}" << endl;
418  break;
420  break;
422  break;
424  break;
426  m_t << "{" << endl;
427  m_t << "\\par" << endl;
428  m_t << rtf_Style_Reset << getStyle("CodeExample");
429  filter(inc->text());
430  m_t << "\\par";
431  m_t << "}" << endl;
432  break;
433  case DocInclude::Snippet:
434  m_t << "{" << endl;
435  if (!m_lastIsPara) m_t << "\\par" << endl;
436  m_t << rtf_Style_Reset << getStyle("CodeExample");
438  ->parseCode(m_ci,
439  inc->context(),
440  extractBlock(inc->text(),inc->blockId()),
441  langExt,
442  inc->isExample(),
443  inc->exampleFile()
444  );
445  m_t << "}";
446  break;
449  err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
450  "Please create a bug report\n",__FILE__);
451  break;
452  }
453  m_lastIsPara=TRUE;
454 }
455 
457 {
458  //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
459  // op->type(),op->isFirst(),op->isLast(),op->text().data());
460  DBG_RTF("{\\comment RTFDocVisitor::visit(DocIncOperator)}\n");
462  if (op->isFirst())
463  {
464  if (!m_hide)
465  {
466  m_t << "{" << endl;
467  m_t << "\\par" << endl;
468  m_t << rtf_Style_Reset << getStyle("CodeExample");
469  }
470  pushEnabled();
471  m_hide = TRUE;
472  }
473  if (op->type()!=DocIncOperator::Skip)
474  {
475  popEnabled();
476  if (!m_hide)
477  {
479  ->parseCode(m_ci,op->context(),op->text(),langExt,
480  op->isExample(),op->exampleFile());
481  }
482  pushEnabled();
483  m_hide=TRUE;
484  }
485  if (op->isLast())
486  {
487  popEnabled();
488  if (!m_hide)
489  {
490  m_t << "\\par";
491  m_t << "}" << endl;
492  }
493  m_lastIsPara=TRUE;
494  }
495  else
496  {
497  if (!m_hide) m_t << endl;
498  m_lastIsPara=FALSE;
499  }
500 }
501 
503 {
504  if (m_hide) return;
505  // TODO: do something sensible here, like including a bitmap
506  DBG_RTF("{\\comment RTFDocVisitor::visit(DocFormula)}\n");
507  m_t << f->text();
508  m_lastIsPara=FALSE;
509 }
510 
512 {
513  if (m_hide) return;
514  DBG_RTF("{\\comment RTFDocVisitor::visit(DocIndexEntry)}\n");
515  m_t << "{\\xe \\v " << i->entry() << "}" << endl;
516  m_lastIsPara=FALSE;
517 }
518 
520 {
521 }
522 
524 {
525  if (m_hide) return;
526  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocCite)}\n");
527  if (!cite->file().isEmpty())
528  {
529  startLink(cite->ref(),cite->file(),cite->anchor());
530  }
531  else
532  {
533  m_t << "{\\b ";
534  }
535  filter(cite->text());
536  if (!cite->file().isEmpty())
537  {
538  endLink(cite->ref());
539  }
540  else
541  {
542  m_t << "}";
543  }
544 }
545 
546 
547 //--------------------------------------
548 // visitor functions for compound nodes
549 //--------------------------------------
550 
552 {
553  if (m_hide) return;
554  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocAutoList)}\n");
555  m_t << "{" << endl;
558  m_lastIsPara=FALSE;
559 }
560 
562 {
563  if (m_hide) return;
564  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoList)}\n");
565  m_t << "\\par";
566  m_t << "}" << endl;
567  m_lastIsPara=TRUE;
568 }
569 
571 {
572  if (m_hide) return;
573  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocAutoListItem)}\n");
574  if (!m_lastIsPara) m_t << "\\par" << endl;
575  m_t << rtf_Style_Reset;
576  if (rtf_listItemInfo[m_indentLevel].isEnum)
577  {
578  m_t << getStyle("ListEnum") << endl;
579  m_t << rtf_listItemInfo[m_indentLevel].number << ".\\tab ";
581  }
582  else
583  {
584  m_t << getStyle("ListBullet") << endl;
585  }
586  incIndentLevel();
587  m_lastIsPara=FALSE;
588 }
589 
591 {
592  decIndentLevel();
593  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoListItem)}\n");
594 }
595 
597 {
598  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
599 }
600 
602 {
603  if (m_hide) return;
604  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
605  if (!m_lastIsPara &&
606  !p->isLast() && // omit <p> for last paragraph
607  !(p->parent() && // and for parameters & sections
609  )
610  )
611  {
612  m_t << "\\par" << endl;
613  m_lastIsPara=TRUE;
614  }
615 }
616 
618 {
619  if (m_hide) return;
620  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocRoot)}\n");
621  if (r->indent()) incIndentLevel();
622  m_t << "{" << rtf_Style["BodyText"]->reference << endl;
623 }
624 
626 {
627  if (m_hide) return;
628  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocRoot)}\n");
629  if (!m_lastIsPara && !r->singleLine()) m_t << "\\par" << endl;
630  m_t << "}";
631  m_lastIsPara=TRUE;
632  if (r->indent()) decIndentLevel();
633 }
634 
636 {
637  if (m_hide) return;
638  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleSect)}\n");
639  if (!m_lastIsPara) m_t << "\\par" << endl;
640  m_t << "{"; // start desc
641  //m_t << "{\\b "; // start bold
642  m_t << "{" << rtf_Style["Heading5"]->reference << endl;
643  switch(s->type())
644  {
645  case DocSimpleSect::See:
646  m_t << theTranslator->trSeeAlso(); break;
647  case DocSimpleSect::Return:
648  m_t << theTranslator->trReturns(); break;
649  case DocSimpleSect::Author:
650  m_t << theTranslator->trAuthor(TRUE,TRUE); break;
652  m_t << theTranslator->trAuthor(TRUE,FALSE); break;
654  m_t << theTranslator->trVersion(); break;
655  case DocSimpleSect::Since:
656  m_t << theTranslator->trSince(); break;
657  case DocSimpleSect::Date:
658  m_t << theTranslator->trDate(); break;
659  case DocSimpleSect::Note:
660  m_t << theTranslator->trNote(); break;
662  m_t << theTranslator->trWarning(); break;
663  case DocSimpleSect::Pre:
664  m_t << theTranslator->trPrecondition(); break;
665  case DocSimpleSect::Post:
666  m_t << theTranslator->trPostcondition(); break;
668  m_t << theTranslator->trCopyright(); break;
670  m_t << theTranslator->trInvariant(); break;
672  m_t << theTranslator->trRemarks(); break;
674  m_t << theTranslator->trAttention(); break;
675  case DocSimpleSect::User: break;
676  case DocSimpleSect::Rcs: break;
677  case DocSimpleSect::Unknown: break;
678  }
679 
680  // special case 1: user defined title
681  if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
682  {
683  m_t << ":";
684  m_t << "\\par";
685  m_t << "}"; // end bold
686  incIndentLevel();
687  m_t << rtf_Style_Reset << getStyle("DescContinue");
688  }
689  m_lastIsPara=FALSE;
690 }
691 
693 {
694  if (m_hide) return;
695  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleSect)}\n");
696  if (!m_lastIsPara) m_t << "\\par" << endl;
697  decIndentLevel();
698  m_t << "}"; // end desc
699  m_lastIsPara=TRUE;
700 }
701 
703 {
704  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocTitle)}\n");
705 }
706 
708 {
709  if (m_hide) return;
710  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocTitle)}\n");
711  m_t << "\\par" << endl;
712  m_t << "}"; // end bold
713  incIndentLevel();
714  m_t << rtf_Style_Reset << getStyle("DescContinue");
715  m_lastIsPara=FALSE;
716 }
717 
719 {
720  if (m_hide) return;
721  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleSect)}\n");
722  m_t << "{" << endl;
724  m_lastIsPara=FALSE;
725 }
726 
728 {
729  if (m_hide) return;
730  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleSect)}\n");
731  if (!m_lastIsPara) m_t << "\\par" << endl;
732  m_t << "}" << endl;
733  m_lastIsPara=TRUE;
734 }
735 
737 {
738  if (m_hide) return;
739  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleListItem)}\n");
740  m_t << "\\par" << rtf_Style_Reset << getStyle("ListBullet") << endl;
741  m_lastIsPara=FALSE;
742  incIndentLevel();
743 }
744 
746 {
747  decIndentLevel();
748  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleListItem)}\n");
749 }
750 
752 {
753  if (m_hide) return;
754  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSection)}\n");
755  if (!m_lastIsPara) m_t << "\\par" << endl;
756  m_t << "{\\bkmkstart " << rtfFormatBmkStr(s->file()+"_"+s->anchor()) << "}" << endl;
757  m_t << "{\\bkmkend " << rtfFormatBmkStr(s->file()+"_"+s->anchor()) << "}" << endl;
758  m_t << "{{" // start section
759  << rtf_Style_Reset;
760  QCString heading;
761  int level = QMIN(s->level()+1,4);
762  heading.sprintf("Heading%d",level);
763  // set style
764  m_t << rtf_Style[heading]->reference << endl;
765  // make table of contents entry
766  filter(s->title());
767  m_t << endl << "\\par" << "}" << endl;
768  m_t << "{\\tc\\tcl" << level << " \\v ";
769  filter(s->title());
770  m_t << "}" << endl;
771  m_lastIsPara=TRUE;
772 }
773 
775 {
776  if (m_hide) return;
777  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSection)}\n");
778  m_t << "\\par}" << endl; // end section
779  m_lastIsPara=TRUE;
780 }
781 
783 {
784  if (m_hide) return;
785  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlList)}\n");
786  m_t << "{" << endl;
789  m_lastIsPara=FALSE;
790 }
791 
793 {
794  if (m_hide) return;
795  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlList)}\n");
796  m_t << "\\par" << "}" << endl;
797  m_lastIsPara=TRUE;
798 }
799 
801 {
802  if (m_hide) return;
803  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlListItem)}\n");
804  m_t << "\\par" << endl;
805  m_t << rtf_Style_Reset;
806  if (rtf_listItemInfo[m_indentLevel].isEnum)
807  {
808  m_t << getStyle("ListEnum") << endl;
809  m_t << rtf_listItemInfo[m_indentLevel].number << ".\\tab ";
811  }
812  else
813  {
814  m_t << getStyle("ListBullet") << endl;
815  }
816  incIndentLevel();
817  m_lastIsPara=FALSE;
818 }
819 
821 {
822  decIndentLevel();
823  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlListItem)}\n");
824 }
825 
827 {
828  if (m_hide) return;
829  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescList)}\n");
830  //m_t << "{" << endl;
831  //m_t << rtf_Style_Reset << getStyle("ListContinue");
832  //m_lastIsPara=FALSE;
833 }
834 
836 {
837  if (m_hide) return;
838  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescList)}\n");
839  //m_t << "}" << endl;
840  //m_t << "\\par" << endl;
841  //m_lastIsPara=TRUE;
842 }
843 
845 {
846  if (m_hide) return;
847  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescTitle)}\n");
848  //m_t << "\\par" << endl;
849  //m_t << "{\\b ";
850  m_t << "{" << rtf_Style["Heading5"]->reference << endl;
851  m_lastIsPara=FALSE;
852 }
853 
855 {
856  if (m_hide) return;
857  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescTitle)}\n");
858  m_t << "\\par" << endl;
859  m_t << "}" << endl;
860  m_lastIsPara=TRUE;
861 }
862 
864 {
865  if (m_hide) return;
866  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescData)}\n");
867  incIndentLevel();
868  m_t << "{" << rtf_Style_Reset << getStyle("DescContinue");
869 }
870 
872 {
873  if (m_hide) return;
874  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescData)}\n");
875  m_t << "\\par";
876  m_t << "}" << endl;
877  decIndentLevel();
878  m_lastIsPara=TRUE;
879 }
880 
882 {
883  if (m_hide) return;
884  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlTable)}\n");
885  if (!m_lastIsPara) m_t << "\\par" << endl;
886  m_lastIsPara=TRUE;
887 }
888 
890 {
891  if (m_hide) return;
892  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlTable)}\n");
893  m_t << "\\pard\\plain" << endl;
894  m_t << "\\par" << endl;
895  m_lastIsPara=TRUE;
896 }
897 
899 {
900  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlCaption)}\n");
901 }
902 
904 {
905  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCaption)}\n");
906 }
907 
909 {
910  if (m_hide) return;
911  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlRow)}\n");
912  uint i,columnWidth=r->numCells()>0 ? rtf_pageWidth/r->numCells() : 10;
913  m_t << "\\trowd \\trgaph108\\trleft-108"
914  "\\trbrdrt\\brdrs\\brdrw10 "
915  "\\trbrdrl\\brdrs\\brdrw10 "
916  "\\trbrdrb\\brdrs\\brdrw10 "
917  "\\trbrdrr\\brdrs\\brdrw10 "
918  "\\trbrdrh\\brdrs\\brdrw10 "
919  "\\trbrdrv\\brdrs\\brdrw10 "<< endl;
920  for (i=0;i<r->numCells();i++)
921  {
922  if (r->isHeading())
923  {
924  m_t << "\\clcbpat16"; // set cell shading to light grey (color 16 in the clut)
925  }
926  m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 "
927  "\\clbrdrl\\brdrs\\brdrw10 "
928  "\\clbrdrb\\brdrs\\brdrw10 "
929  "\\clbrdrr \\brdrs\\brdrw10 "
930  "\\cltxlrtb "
931  "\\cellx" << ((i+1)*columnWidth) << endl;
932  }
933  m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
934  m_lastIsPara=FALSE;
935 }
936 
938 {
939  if (m_hide) return;
940  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlRow)}\n");
941  m_t << endl;
942  m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
943  m_t << "{\\row }" << endl;
944  m_lastIsPara=FALSE;
945 }
946 
948 {
949  if (m_hide) return;
950  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlCell)}\n");
951  m_t << "{" << align(c);
952  m_lastIsPara=FALSE;
953 }
954 
956 {
957  if (m_hide) return;
958  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCell)}\n");
959  m_t << "\\cell }";
960  m_lastIsPara=FALSE;
961 }
962 
964 {
965  if (m_hide) return;
966  //DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocInternal)}\n");
967  //m_t << "{"; // start desc
968  //m_t << "{\\b "; // start bold
969  //m_t << theTranslator->trForInternalUseOnly();
970  //m_t << "}"; // end bold
971  //m_t << "\\par" << endl;
972  //incIndentLevel();
973  //m_t << rtf_Style_Reset << getStyle("DescContinue");
974  //m_lastIsPara=FALSE;
975 }
976 
978 {
979  if (m_hide) return;
980  //DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternal)}\n");
981  //m_t << "\\par";
982  //decIndentLevel();
983  //m_t << "}"; // end desc
984  //m_lastIsPara=TRUE;
985 }
986 
988 {
989  if (m_hide) return;
990  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHRef)}\n");
991  if (Config_getBool(RTF_HYPERLINKS))
992  {
993  m_t << "{\\field "
994  "{\\*\\fldinst "
995  "{ HYPERLINK \"" << href->url() << "\" "
996  "}{}"
997  "}"
998  "{\\fldrslt "
999  "{\\cs37\\ul\\cf2 ";
1000 
1001  }
1002  else
1003  {
1004  m_t << "{\\f2 ";
1005  }
1006  m_lastIsPara=FALSE;
1007 }
1008 
1010 {
1011  if (m_hide) return;
1012  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHRef)}\n");
1013  if (Config_getBool(RTF_HYPERLINKS))
1014  {
1015  m_t << "}"
1016  "}"
1017  "}";
1018  }
1019  else
1020  {
1021  m_t << "}";
1022  }
1023  m_lastIsPara=FALSE;
1024 }
1025 
1027 {
1028  if (m_hide) return;
1029  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlHeader)}\n");
1030  m_t << "{" // start section
1031  << rtf_Style_Reset;
1032  QCString heading;
1033  int level = QMIN(header->level()+2,4);
1034  heading.sprintf("Heading%d",level);
1035  // set style
1036  m_t << rtf_Style[heading]->reference;
1037  // make open table of contents entry that will be closed in visitPost method
1038  m_t << "{\\tc\\tcl" << level << " ";
1039  m_lastIsPara=FALSE;
1040 }
1041 
1043 {
1044  if (m_hide) return;
1045  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlHeader)}\n");
1046  // close open table of contens entry
1047  m_t << "} \\par";
1048  m_t << "}" << endl; // end section
1049  m_lastIsPara=TRUE;
1050 }
1051 
1053 {
1054  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocImage)}\n");
1055  includePicturePreRTF(img->name(), img->type()==DocImage::Rtf, img->hasCaption());
1056 }
1057 
1058 void RTFDocVisitor::includePicturePreRTF(const QCString name, const bool isTypeRTF, const bool hasCaption)
1059 {
1060  if (isTypeRTF)
1061  {
1062  m_t << "\\par" << endl;
1063  m_t << "{" << endl;
1064  m_t << rtf_Style_Reset << endl;
1065  if (hasCaption || m_lastIsPara) m_t << "\\par" << endl;
1066  m_t << "\\pard \\qc { \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
1067  m_t << name;
1068  m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}" << endl;
1069  m_t << "\\par" << endl;
1070  if (hasCaption)
1071  {
1072  m_t << "\\pard \\qc \\b";
1073  m_t << "{Image \\field\\flddirty{\\*\\fldinst { SEQ Image \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
1074  }
1075  m_lastIsPara=TRUE;
1076  }
1077  else // other format -> skip
1078  {
1079  pushEnabled();
1080  m_hide=TRUE;
1081  }
1082 }
1083 
1085 {
1086  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocImage)}\n");
1088 }
1089 
1090 void RTFDocVisitor::includePicturePostRTF(const bool isTypeRTF, const bool hasCaption)
1091 {
1092  if (isTypeRTF)
1093  {
1094  if (m_hide) return;
1095  if (hasCaption)
1096  {
1097  m_t << "}" <<endl;
1098  m_t << "\\par}" <<endl;
1099  }
1100  else
1101  {
1102  m_t << "}" <<endl;
1103  }
1104  }
1105  else
1106  {
1107  popEnabled();
1108  }
1109 }
1110 
1112 {
1113  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocDotFile)}\n");
1114  writeDotFile(df);
1115 }
1116 
1118 {
1119  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDotFile)}\n");
1120  includePicturePostRTF(true, df->hasCaption());
1121 }
1123 {
1124  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocMscFile)}\n");
1125  writeMscFile(df);
1126 }
1127 
1129 {
1130  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocMscFile)}\n");
1131  includePicturePostRTF(true, df->hasCaption());
1132 }
1133 
1135 {
1136  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocDiaFile)}\n");
1137  writeDiaFile(df);
1138 }
1139 
1141 {
1142  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDiaFile)}\n");
1143  includePicturePostRTF(true, df->hasCaption());
1144 }
1145 
1147 {
1148  if (m_hide) return;
1149  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocLink)}\n");
1150  startLink(lnk->ref(),lnk->file(),lnk->anchor());
1151 }
1152 
1154 {
1155  if (m_hide) return;
1156  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLink)}\n");
1157  endLink(lnk->ref());
1158 }
1159 
1161 {
1162  if (m_hide) return;
1163  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocRef)}\n");
1164  // when ref->isSubPage()==TRUE we use ref->file() for HTML and
1165  // ref->anchor() for LaTeX/RTF
1166  if (ref->isSubPage())
1167  {
1168  startLink(ref->ref(),0,ref->anchor());
1169  }
1170  else
1171  {
1172  if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
1173  }
1174  if (!ref->hasLinkText()) filter(ref->targetTitle());
1175 }
1176 
1178 {
1179  if (m_hide) return;
1180  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocRef)}\n");
1181  if (!ref->file().isEmpty()) endLink(ref->ref());
1182  //m_t << " ";
1183 }
1184 
1185 
1187 {
1188  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSecRefItem)}\n");
1189 }
1190 
1192 {
1193  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefItem)}\n");
1194 }
1195 
1197 {
1198  if (m_hide) return;
1199  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSecRefList)}\n");
1200  m_t << "{" << endl;
1201  incIndentLevel();
1202  m_t << rtf_Style_Reset << getStyle("LatexTOC") << endl;
1203  m_t << "\\par" << endl;
1204  m_lastIsPara=TRUE;
1205 }
1206 
1208 {
1209  if (m_hide) return;
1210  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefList)}\n");
1211  decIndentLevel();
1212  m_t << "\\par";
1213  m_t << "}" << endl;
1214  m_lastIsPara=TRUE;
1215 }
1216 
1217 //void RTFDocVisitor::visitPre(DocLanguage *l)
1218 //{
1219 // DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocLanguage)}\n");
1220 // QCString langId = Config_getEnum(OUTPUT_LANGUAGE);
1221 // if (l->id().lower()!=langId.lower())
1222 // {
1223 // pushEnabled();
1224 // m_hide = TRUE;
1225 // }
1226 //}
1227 //
1228 //void RTFDocVisitor::visitPost(DocLanguage *l)
1229 //{
1230 // DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLanguage)}\n");
1231 // QCString langId = Config_getEnum(OUTPUT_LANGUAGE);
1232 // if (l->id().lower()!=langId.lower())
1233 // {
1234 // popEnabled();
1235 // }
1236 //}
1237 
1239 {
1240  if (m_hide) return;
1241  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamSect)}\n");
1242  m_t << "{"; // start param list
1243  if (!m_lastIsPara) m_t << "\\par" << endl;
1244  //m_t << "{\\b "; // start bold
1245  m_t << "{" << rtf_Style["Heading5"]->reference << endl;
1246  switch(s->type())
1247  {
1248  case DocParamSect::Param:
1249  m_t << theTranslator->trParameters(); break;
1250  case DocParamSect::RetVal:
1251  m_t << theTranslator->trReturnValues(); break;
1253  m_t << theTranslator->trExceptions(); break;
1255  /* TODO: add this
1256  m_t << theTranslator->trTemplateParam(); break;
1257  */
1258  m_t << "Template Parameters"; break;
1259  default:
1260  ASSERT(0);
1261  }
1262  m_t << ":";
1263  m_t << "\\par";
1264  m_t << "}" << endl;
1265  bool useTable = s->type()==DocParamSect::Param ||
1266  s->type()==DocParamSect::RetVal ||
1267  s->type()==DocParamSect::Exception ||
1269  if (!useTable)
1270  {
1271  incIndentLevel();
1272  }
1273  m_t << rtf_Style_Reset << getStyle("DescContinue");
1274  m_lastIsPara=TRUE;
1275 }
1276 
1278 {
1279  if (m_hide) return;
1280  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamSect)}\n");
1281  //m_t << "\\par" << endl;
1282  bool useTable = s->type()==DocParamSect::Param ||
1283  s->type()==DocParamSect::RetVal ||
1284  s->type()==DocParamSect::Exception ||
1286  if (!useTable)
1287  {
1288  decIndentLevel();
1289  }
1290  m_t << "}" << endl;
1291 }
1292 
1294 {
1295  static int columnPos[4][5] =
1296  { { 2, 25, 100, 100, 100 }, // no inout, no type
1297  { 3, 14, 35, 100, 100 }, // inout, no type
1298  { 3, 25, 50, 100, 100 }, // no inout, type
1299  { 4, 14, 35, 55, 100 }, // inout, type
1300  };
1301  int config=0;
1302  if (m_hide) return;
1303  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamList)}\n");
1304 
1306  DocParamSect *sect = 0;
1307  if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
1308  {
1309  parentType = ((DocParamSect*)pl->parent())->type();
1310  sect=(DocParamSect*)pl->parent();
1311  }
1312  bool useTable = parentType==DocParamSect::Param ||
1313  parentType==DocParamSect::RetVal ||
1314  parentType==DocParamSect::Exception ||
1315  parentType==DocParamSect::TemplateParam;
1316  if (sect && sect->hasInOutSpecifier()) config+=1;
1317  if (sect && sect->hasTypeSpecifier()) config+=2;
1318  if (useTable)
1319  {
1320  int i;
1321  m_t << "\\trowd \\trgaph108\\trleft426\\tblind426"
1322  "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1323  "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1324  "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1325  "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
1326  "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
1327  "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<< endl;
1328  for (i=0;i<columnPos[config][0];i++)
1329  {
1330  m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1331  "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1332  "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1333  "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
1334  "\\cltxlrtb "
1335  "\\cellx" << (rtf_pageWidth*columnPos[config][i+1]/100) << endl;
1336  }
1337  m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
1338  }
1339 
1340  if (sect && sect->hasInOutSpecifier())
1341  {
1342  if (useTable)
1343  {
1344  m_t << "{";
1345  }
1346 
1347  // Put in the direction: in/out/in,out if specified.
1349  {
1350  if (pl->direction()==DocParamSect::In)
1351  {
1352  m_t << "in";
1353  }
1354  else if (pl->direction()==DocParamSect::Out)
1355  {
1356  m_t << "out";
1357  }
1358  else if (pl->direction()==DocParamSect::InOut)
1359  {
1360  m_t << "in,out";
1361  }
1362  }
1363 
1364  if (useTable)
1365  {
1366  m_t << "\\cell }";
1367  }
1368  }
1369 
1370  if (sect && sect->hasTypeSpecifier())
1371  {
1372  if (useTable)
1373  {
1374  m_t << "{";
1375  }
1376  QListIterator<DocNode> li(pl->paramTypes());
1377  DocNode *type;
1378  bool first=TRUE;
1379  for (li.toFirst();(type=li.current());++li)
1380  {
1381  if (!first) m_t << " | "; else first=FALSE;
1382  if (type->kind()==DocNode::Kind_Word)
1383  {
1384  visit((DocWord*)type);
1385  }
1386  else if (type->kind()==DocNode::Kind_LinkedWord)
1387  {
1388  visit((DocLinkedWord*)type);
1389  }
1390  }
1391  if (useTable)
1392  {
1393  m_t << "\\cell }";
1394  }
1395  }
1396 
1397 
1398  if (useTable)
1399  {
1400  m_t << "{";
1401  }
1402 
1403  m_t << "{\\i ";
1404  //QStrListIterator li(pl->parameters());
1405  //const char *s;
1406  QListIterator<DocNode> li(pl->parameters());
1407  DocNode *param;
1408  bool first=TRUE;
1409  for (li.toFirst();(param=li.current());++li)
1410  {
1411  if (!first) m_t << ","; else first=FALSE;
1412  if (param->kind()==DocNode::Kind_Word)
1413  {
1414  visit((DocWord*)param);
1415  }
1416  else if (param->kind()==DocNode::Kind_LinkedWord)
1417  {
1418  visit((DocLinkedWord*)param);
1419  }
1420  }
1421  m_t << "} ";
1422 
1423  if (useTable)
1424  {
1425  m_t << "\\cell }{";
1426  }
1427  m_lastIsPara=TRUE;
1428 }
1429 
1431 {
1432  if (m_hide) return;
1433  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamList)}\n");
1434 
1436  //DocParamSect *sect = 0;
1437  if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
1438  {
1439  parentType = ((DocParamSect*)pl->parent())->type();
1440  //sect=(DocParamSect*)pl->parent();
1441  }
1442  bool useTable = parentType==DocParamSect::Param ||
1443  parentType==DocParamSect::RetVal ||
1444  parentType==DocParamSect::Exception ||
1445  parentType==DocParamSect::TemplateParam;
1446  if (useTable)
1447  {
1448  m_t << "\\cell }" << endl;
1449  //m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
1450  m_t << "{\\row }" << endl;
1451  }
1452  else
1453  {
1454  m_t << "\\par" << endl;
1455  }
1456 
1457  m_lastIsPara=TRUE;
1458 }
1459 
1461 {
1462  if (m_hide) return;
1463  if (x->title().isEmpty()) return;
1464  bool anonymousEnum = x->file()=="@";
1465  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocXRefItem)}\n");
1466  if (!m_lastIsPara)
1467  {
1468  m_t << "\\par" << endl;
1469  m_lastIsPara=TRUE;
1470  }
1471  m_t << "{"; // start param list
1472  //m_t << "{\\b "; // start bold
1473  m_t << "{" << rtf_Style["Heading5"]->reference << endl;
1474  if (Config_getBool(RTF_HYPERLINKS) && !anonymousEnum)
1475  {
1476  QCString refName;
1477  if (!x->file().isEmpty())
1478  {
1479  refName+=x->file();
1480  }
1481  if (!x->file().isEmpty() && !x->anchor().isEmpty())
1482  {
1483  refName+="_";
1484  }
1485  if (!x->anchor().isEmpty())
1486  {
1487  refName+=x->anchor();
1488  }
1489 
1490  m_t << "{\\field "
1491  "{\\*\\fldinst "
1492  "{ HYPERLINK \\\\l \"" << refName << "\" "
1493  "}{}"
1494  "}"
1495  "{\\fldrslt "
1496  "{\\cs37\\ul\\cf2 ";
1497  filter(x->title());
1498  m_t << "}"
1499  "}"
1500  "}";
1501  }
1502  else
1503  {
1504  filter(x->title());
1505  }
1506  m_t << ":";
1507  m_t << "\\par";
1508  m_t << "}"; // end bold
1509  incIndentLevel();
1510  m_t << rtf_Style_Reset << getStyle("DescContinue");
1511  m_lastIsPara=FALSE;
1512 }
1513 
1515 {
1516  if (m_hide) return;
1517  if (x->title().isEmpty()) return;
1518  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocXRefItem)}\n");
1519  m_t << "\\par" << endl;
1520  decIndentLevel();
1521  m_t << "}" << endl; // end xref item
1522  m_lastIsPara=TRUE;
1523 }
1524 
1526 {
1527  if (m_hide) return;
1528  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocInternalRef)}\n");
1529  startLink("",ref->file(),ref->anchor());
1530 }
1531 
1533 {
1534  if (m_hide) return;
1535  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternalRef)}\n");
1536  endLink("");
1537  m_t << " ";
1538 }
1539 
1541 {
1542  if (m_hide) return;
1543  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocCopy)}\n");
1544 }
1545 
1547 {
1548  if (m_hide) return;
1549  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocCopy)}\n");
1550 }
1551 
1553 {
1554  if (m_hide) return;
1555  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocText)}\n");
1556 }
1557 
1559 {
1560  if (m_hide) return;
1561  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocText)}\n");
1562 }
1563 
1565 {
1566  if (m_hide) return;
1567  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlBlockQuote)}\n");
1568  if (!m_lastIsPara) m_t << "\\par" << endl;
1569  m_t << "{"; // start desc
1570  incIndentLevel();
1571  m_t << rtf_Style_Reset << getStyle("DescContinue");
1572 }
1573 
1575 {
1576  if (m_hide) return;
1577  DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlBlockQuote)}\n");
1578  if (!m_lastIsPara) m_t << "\\par" << endl;
1579  decIndentLevel();
1580  m_t << "}"; // end desc
1581  m_lastIsPara=TRUE;
1582 }
1583 
1585 {
1586  if (m_hide) return;
1587 }
1588 
1590 {
1591  if (m_hide) return;
1592 }
1593 
1595 {
1596  if (m_hide) return;
1597 }
1598 
1600 {
1601  if (m_hide) return;
1602 }
1603 
1604 
1605 //static char* getMultiByte(int c)
1606 //{
1607 // static char s[10];
1608 // sprintf(s,"\\'%X",c);
1609 // return s;
1610 //}
1611 
1612 void RTFDocVisitor::filter(const char *str,bool verbatim)
1613 {
1614  if (str)
1615  {
1616  const unsigned char *p=(const unsigned char *)str;
1617  unsigned char c;
1618  //unsigned char pc='\0';
1619  while (*p)
1620  {
1621  //static bool MultiByte = FALSE;
1622  c=*p++;
1623 
1624  //if ( MultiByte )
1625  //{
1626  // m_t << getMultiByte( c );
1627  // MultiByte = FALSE;
1628  // continue;
1629  //}
1630  //if ( c >= 0x80 )
1631  //{
1632  // MultiByte = TRUE;
1633  // m_t << getMultiByte( c );
1634  // continue;
1635  //}
1636 
1637  switch (c)
1638  {
1639  case '{': m_t << "\\{"; break;
1640  case '}': m_t << "\\}"; break;
1641  case '\\': m_t << "\\\\"; break;
1642  case '\n': if (verbatim)
1643  {
1644  m_t << "\\par" << endl;
1645  }
1646  else
1647  {
1648  m_t << '\n';
1649  }
1650  break;
1651  default: m_t << (char)c;
1652  }
1653  //pc = c;
1654  }
1655  }
1656 }
1657 
1658 void RTFDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
1659 {
1660  if (ref.isEmpty() && Config_getBool(RTF_HYPERLINKS))
1661  {
1662  QCString refName;
1663  if (!file.isEmpty())
1664  {
1665  refName+=file;
1666  }
1667  if (!file.isEmpty() && anchor)
1668  {
1669  refName+='_';
1670  }
1671  if (anchor)
1672  {
1673  refName+=anchor;
1674  }
1675 
1676  m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1677  m_t << rtfFormatBmkStr(refName);
1678  m_t << "\" }{}";
1679  m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
1680  }
1681  else
1682  {
1683  m_t << "{\\b ";
1684  }
1685  m_lastIsPara=FALSE;
1686 }
1687 
1688 void RTFDocVisitor::endLink(const QCString &ref)
1689 {
1690  if (ref.isEmpty() && Config_getBool(RTF_HYPERLINKS))
1691  {
1692  m_t << "}}}";
1693  }
1694  else
1695  {
1696  m_t << "}";
1697  }
1698  m_lastIsPara=FALSE;
1699 }
1700 
1702 {
1703  m_enabled.push(new bool(m_hide));
1704 }
1705 
1707 {
1708  bool *v=m_enabled.pop();
1709  ASSERT(v!=0);
1710  m_hide = *v;
1711  delete v;
1712 }
1713 
1715 {
1716  writeDotFile(df->file(), df->hasCaption());
1717 }
1718 void RTFDocVisitor::writeDotFile(const QCString &filename, const bool hasCaption)
1719 {
1720  QCString baseName=filename;
1721  int i;
1722  if ((i=baseName.findRev('/'))!=-1)
1723  {
1724  baseName=baseName.right(baseName.length()-i-1);
1725  }
1726  QCString outDir = Config_getString(RTF_OUTPUT);
1727  writeDotGraphFromFile(filename,outDir,baseName,GOF_BITMAP);
1728  QCString imgExt = getDotImageExtension();
1729  includePicturePreRTF(baseName + "." + imgExt, true, hasCaption);
1730 }
1731 
1733 {
1734  writeMscFile(df->file(), df->hasCaption());
1735 }
1736 void RTFDocVisitor::writeMscFile(const QCString &fileName, const bool hasCaption)
1737 {
1738  QCString baseName=fileName;
1739  int i;
1740  if ((i=baseName.findRev('/'))!=-1)
1741  {
1742  baseName=baseName.right(baseName.length()-i-1);
1743  }
1744  QCString outDir = Config_getString(RTF_OUTPUT);
1745  writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
1746  includePicturePreRTF(baseName + ".png", true, hasCaption);
1747 }
1748 
1750 {
1751  QCString baseName=df->file();
1752  int i;
1753  if ((i=baseName.findRev('/'))!=-1)
1754  {
1755  baseName=baseName.right(baseName.length()-i-1);
1756  }
1757  QCString outDir = Config_getString(RTF_OUTPUT);
1758  writeDiaGraphFromFile(df->file(),outDir,baseName,DIA_BITMAP);
1759  includePicturePreRTF(baseName + ".png", true, df->hasCaption());
1760 }
1761 
1762 void RTFDocVisitor::writePlantUMLFile(const QCString &fileName, const bool hasCaption)
1763 {
1764  QCString baseName=fileName;
1765  int i;
1766  if ((i=baseName.findRev('/'))!=-1)
1767  {
1768  baseName=baseName.right(baseName.length()-i-1);
1769  }
1770  QCString outDir = Config_getString(RTF_OUTPUT);
1771  generatePlantUMLOutput(fileName,outDir,PUML_BITMAP);
1772  includePicturePreRTF(baseName + ".png", true, hasCaption);
1773 }