diff options
Diffstat (limited to 'src/rtfgen.cpp')
-rw-r--r-- | src/rtfgen.cpp | 2946 |
1 files changed, 2946 insertions, 0 deletions
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp new file mode 100644 index 0000000..b1b7e4b --- /dev/null +++ b/src/rtfgen.cpp @@ -0,0 +1,2946 @@ +/****************************************************************************** + * + * $Id: rtfgen.cpp,v 1.14 2001/03/19 19:27:41 root Exp $ + * + * Copyright (C) 1997-2012 by Parker Waechter & Dimitri van Heesch. + * + * Style sheet additions by Alexander Bartolich + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include <stdlib.h> + +#include "qtbc.h" +#include <qdir.h> +#include <qregexp.h> + +#include "rtfgen.h" +#include "config.h" +#include "message.h" +#include "doxygen.h" +#include "util.h" +#include "diagram.h" +#include "language.h" +#include "dot.h" +#include "version.h" +#include "pagedef.h" +#include "rtfstyle.h" +#include "rtfdocvisitor.h" +#include "docparser.h" +#include "dirdef.h" +#include "vhdldocgen.h" +#include "portable.h" + +//#define DBG_RTF(x) x; +#define DBG_RTF(x) + +static QCString dateToRTFDateString() +{ + const QDateTime &d = QDateTime::currentDateTime(); + QCString result; + result.sprintf("\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d", + d.date().year(), d.date().month(), d.date().day(), + d.time().hour(),d.time().minute(),d.time().second()); + return result; +} + +RTFGenerator::RTFGenerator() : OutputGenerator() +{ + dir=Config_getString("RTF_OUTPUT"); + col=0; + //insideTabbing=FALSE; + m_listLevel = 0; + m_bstartedBody = FALSE; + m_omitParagraph = FALSE; + m_numCols = 0; +} + +RTFGenerator::~RTFGenerator() +{ +} + +//void RTFGenerator::append(const OutputGenerator *g) +//{ +// t << g->getContents(); +// col+=((RTFGenerator *)g)->col; +// //insideTabbing=insideTabbing || ((RTFGenerator *)g)->insideTabbing; +// m_listLevel=((RTFGenerator *)g)->m_listLevel; +// m_omitParagraph=((RTFGenerator *)g)->m_omitParagraph; +// //printf("RTFGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(), +// // insideTabbing ? "TRUE" : "FALSE" ); +//} + +//OutputGenerator *RTFGenerator::copy() +//{ +// RTFGenerator *result = new RTFGenerator; +// //result->insideTabbing=insideTabbing; +// result->m_listLevel=m_listLevel; +// result->m_omitParagraph=m_omitParagraph; +// return result; +//} + +void RTFGenerator::writeStyleSheetFile(QFile &file) +{ + QTextStream t(&file); + t << "# Generated by doxygen " << versionString << "\n\n"; + t << "# This file describes styles used for generating RTF output.\n"; + t << "# All text after a hash (#) is considered a comment and will be ignored.\n"; + t << "# Remove a hash to activate a line.\n\n"; + + int i; + for ( i=0 ; rtf_Style_Default[i].reference!=0 ; i++ ) + { + t << "# " << rtf_Style_Default[i].name << " = " + << rtf_Style_Default[i].reference + << rtf_Style_Default[i].definition << endl; + } +} + +void RTFGenerator::writeExtensionsFile(QFile &file) +{ + QTextStream t(&file); + t << "# Generated by doxygen " << versionString << "\n\n"; + t << "# This file describes extensions used for generating RTF output.\n"; + t << "# All text after a hash (#) is considered a comment and will be ignored.\n"; + t << "# Remove a hash to activate a line.\n\n"; + + t << "# Overrides the project title.\n"; + + t << "#Title = \n\n"; + + t << "# Name of the company that produced this document.\n"; + t << "#Company = \n\n"; + + t << "# Filename of a company or project logo.\n"; + t << "#LogoFilename = \n\n"; + + t << "# Author of the document.\n"; + t << "#Author = \n\n"; + + t << "# Type of document (e.g. Design Specification, User Manual, etc.).\n"; + t << "#DocumentType = \n\n"; + + t << "# Document tracking number.\n"; + t << "#DocumentId = \n\n"; + + t << "# Name of the author's manager.\n"; + t << "# This field is not displayed in the document itself, but it is \n"; + t << "# available in the information block of the rtf file. In Microsoft \n"; + t << "# Word, it is available under File:Properties.\n"; + t << "#Manager = \n\n"; + + t << "# Subject of the document.\n"; + t << "# This field is not displayed in the document itself, but it is \n"; + t << "# available in the information block of the rtf file. In Microsoft \n"; + t << "# Word, it is available under File:Properties.\n"; + t << "#Subject = \n\n"; + + t << "# Comments regarding the document.\n"; + t << "# This field is not displayed in the document itself, but it is \n"; + t << "# available in the information block of the rtf file. In Microsoft \n"; + t << "# Word, it is available under File:Properties.\n"; + t << "#Comments = \n\n"; + + t << "# Keywords associated with the document.\n"; + t << "# This field is not displayed in the document itself, but it is \n"; + t << "# available in the information block of the rtf file. In Microsoft \n"; + t << "# Word, it is available under File:Properties.\n"; + t << "#Keywords = \n\n"; +} + + +void RTFGenerator::init() +{ + QCString dir=Config_getString("RTF_OUTPUT"); + QDir d(dir); + if (!d.exists() && !d.mkdir(dir)) + { + err("Could not create output directory %s\n",dir.data()); + exit(1); + } + rtf_Style.setAutoDelete(TRUE); + + // first duplicate strings of rtf_Style_Default + const struct Rtf_Style_Default* def = rtf_Style_Default; + while(def->reference != 0) + { + if (def->definition == 0) + err("Internal error: rtf_Style_Default[%s] has no definition.\n", def->name); + StyleData* styleData = new StyleData(def->reference, def->definition); + rtf_Style.insert(def->name, styleData); + def++; + } + + // overwrite some (or all) definitions from file + QCString &rtfStyleSheetFile = Config_getString("RTF_STYLESHEET_FILE"); + if (!rtfStyleSheetFile.isEmpty()) + { + loadStylesheet(rtfStyleSheetFile, rtf_Style); + } + + // If user has defined an extension file, load its contents. + QCString &rtfExtensionsFile = Config_getString("RTF_EXTENSIONS_FILE"); + if (!rtfExtensionsFile.isEmpty()) + { + loadExtensions(rtfExtensionsFile); + } + + createSubDirs(d); +} + +static QCString makeIndexName(const char *s,int i) +{ + QCString result=s; + result+=(char)(i+'0'); + return result; +} + +void RTFGenerator::beginRTFDocument() +{ + /* all the included RTF files should begin with the + * same header + */ + t <<"{\\rtf1\\ansi\\ansicpg" << theTranslator->trRTFansicp(); + t <<"\\uc1 \\deff0\\deflang1033\\deflangfe1033\n"; + + DBG_RTF(t <<"{\\comment Beginning font list}\n") + t <<"{\\fonttbl "; + t <<"{\\f0\\froman\\fcharset" << theTranslator->trRTFCharSet(); + t <<"\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n"; + t <<"{\\f1\\fswiss\\fcharset" << theTranslator->trRTFCharSet(); + t <<"\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n"; + t <<"{\\f2\\fmodern\\fcharset" << theTranslator->trRTFCharSet(); + t <<"\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n"; + t <<"{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}\n"; + t <<"}\n"; + DBG_RTF(t <<"{\\comment begin colors}\n") + t <<"{\\colortbl;"; + t <<"\\red0\\green0\\blue0;"; + t <<"\\red0\\green0\\blue255;"; + t <<"\\red0\\green255\\blue255;"; + t <<"\\red0\\green255\\blue0;"; + t <<"\\red255\\green0\\blue255;"; + t <<"\\red255\\green0\\blue0;"; + t <<"\\red255\\green255\\blue0;"; + t <<"\\red255\\green255\\blue255;"; + t <<"\\red0\\green0\\blue128;"; + t <<"\\red0\\green128\\blue128;"; + t <<"\\red0\\green128\\blue0;"; + t <<"\\red128\\green0\\blue128;"; + t <<"\\red128\\green0\\blue0;"; + t <<"\\red128\\green128\\blue0;"; + t <<"\\red128\\green128\\blue128;"; + t <<"\\red192\\green192\\blue192;}" << endl; + + DBG_RTF(t <<"{\\comment Beginning style list}\n") + t <<"{\\stylesheet\n"; + t <<"{\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\n"; + + // sort styles ascending by \s-number via an intermediate QArray + QArray<const StyleData*> array(128); + array.fill(0); + QDictIterator<StyleData> iter(rtf_Style); + const StyleData* style; + for(; (style = iter.current()); ++iter) + { + unsigned index = style->index; + unsigned size = array.size(); + if (index >= size) + { + // +1 to add at least one element, then align up to multiple of 8 + array.resize((index + 1 + 7) & ~7); + array.fill(0, size); + ASSERT(index < array.size()); + } + if (array.at(index) != 0) + { + QCString key(convertToQCString(iter.currentKey())); + msg("Style '%s' redefines \\s%d.\n", key.data(), index); + } + array.at(index) = style; + } + + // write array elements + unsigned size = array.size(); + for(unsigned i = 0; i < size; i++) + { + const StyleData* style = array.at(i); + if (style != 0) + t <<"{" << style->reference << style->definition << ";}\n"; + } + + t <<"}" << endl; + // this comment is needed for postprocessing! + t <<"{\\comment begin body}" << endl; + +} + +void RTFGenerator::beginRTFChapter() +{ + t <<"\n"; + DBG_RTF(t << "{\\comment BeginRTFChapter}\n") + t << rtf_Style_Reset; + + // if we are compact, no extra page breaks... + if (Config_getBool("COMPACT_RTF")) + { + // t <<"\\sect\\sectd\\sbknone\n"; + t <<"\\sect\\sbknone\n"; + rtfwriteRuler_thick(); + } + else + t <<"\\sect\\sbkpage\n"; + //t <<"\\sect\\sectd\\sbkpage\n"; + + t << rtf_Style["Heading1"]->reference << "\n"; +} + +void RTFGenerator::beginRTFSection() +{ + t <<"\n"; + DBG_RTF(t << "{\\comment BeginRTFSection}\n") + t << rtf_Style_Reset; + + // if we are compact, no extra page breaks... + if (Config_getBool("COMPACT_RTF")) + { + // t <<"\\sect\\sectd\\sbknone\n"; + t <<"\\sect\\sbknone\n"; + rtfwriteRuler_emboss(); + } + else + t <<"\\sect\\sbkpage\n"; + //t <<"\\sect\\sectd\\sbkpage\n"; + + t << rtf_Style["Heading2"]->reference << "\n"; +} + +void RTFGenerator::startFile(const char *name,const char *,const char *) +{ + //setEncoding(QCString().sprintf("CP%s",theTranslator->trRTFansicp())); + QCString fileName=name; + relPath = relativePathToRoot(fileName); + + if (fileName.right(4)!=".rtf" ) fileName+=".rtf"; + startPlainFile(fileName); + beginRTFDocument(); +} + +void RTFGenerator::endFile() +{ + DBG_RTF(t << "{\\comment endFile}\n") + t << "}"; + + endPlainFile(); +} + +void RTFGenerator::startProjectNumber() +{ + DBG_RTF(t <<"{\\comment startProjectNumber }" << endl) + t << " "; +} + +void RTFGenerator::endProjectNumber() +{ + DBG_RTF(t <<"{\\comment endProjectNumber }" << endl) +} + +void RTFGenerator::startIndexSection(IndexSections is) +{ + //QCString paperName; + + m_listLevel = 0; + + switch (is) + { + case isTitlePageStart: + // basic RTFstart + // get readyfor author etc + + t << "{\\info \n"; + t << "{\\title {\\comment "; + break; + case isTitlePageAuthor: + t << "}\n"; + if (rtf_subject) t << "{\\subject " << rtf_subject << "}\n"; + if (rtf_comments) t << "{\\comment " << rtf_comments << "}\n"; + if (rtf_company) t << "{\\company " << rtf_company << "}\n"; + if (rtf_author) t << "{\\author " << rtf_author << "}\n"; + if (rtf_manager) t << "{\\manager " << rtf_manager << "}\n"; + if (rtf_documentType) t << "{\\category " << rtf_documentType << "}\n"; + if (rtf_keywords) t << "{\\keywords " << rtf_keywords << "}\n"; + t << "{\\comment "; + break; + case isMainPage: + //Introduction + beginRTFChapter(); + break; + //case isPackageIndex: + // //Package Index + // beginRTFChapter(); + // break; + case isModuleIndex: + //Module Index + beginRTFChapter(); + break; + case isDirIndex: + //Directory Index + beginRTFChapter(); + break; + case isNamespaceIndex: + //Namespace Index + beginRTFChapter(); + break; + case isClassHierarchyIndex: + //Hierarchical Index + DBG_RTF(t << "{\\comment start classhierarchy}\n") + beginRTFChapter(); + break; + case isCompoundIndex: + //Annotated Compound Index + beginRTFChapter(); + break; + case isFileIndex: + //Annotated File Index + beginRTFChapter(); + break; + case isPageIndex: + //Related Page Index + beginRTFChapter(); + break; + case isModuleDocumentation: + { + //Module Documentation + GroupSDict::Iterator gli(*Doxygen::groupSDict); + GroupDef *gd; + bool found=FALSE; + for (gli.toFirst();(gd=gli.current()) && !found;++gli) + { + if (!gd->isReference()) + { + beginRTFChapter(); + found=TRUE; + } + } + } + break; + case isDirDocumentation: + { + //Directory Documentation + SDict<DirDef>::Iterator dli(*Doxygen::directories); + DirDef *dd; + bool found=FALSE; + for (dli.toFirst();(dd=dli.current()) && !found;++dli) + { + if (dd->isLinkableInProject()) + { + beginRTFChapter(); + found=TRUE; + } + } + } + break; + case isNamespaceDocumentation: + { + // Namespace Documentation + NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); + NamespaceDef *nd; + bool found=FALSE; + for (nli.toFirst();(nd=nli.current()) && !found;++nli) + { + if (nd->isLinkableInProject()) + { + beginRTFChapter(); + found=TRUE; + } + } + } + break; + case isClassDocumentation: + { + //Compound Documentation + ClassSDict::Iterator cli(*Doxygen::classSDict); + ClassDef *cd=0; + bool found=FALSE; + for (cli.toFirst();(cd=cli.current()) && !found;++cli) + { + if (cd->isLinkableInProject() && + cd->templateMaster()==0 && + !cd->isEmbeddedInOuterScope() + ) + { + beginRTFChapter(); + found=TRUE; + } + } + } + break; + case isFileDocumentation: + { + //File Documentation + bool isFirst=TRUE; + FileName *fn=Doxygen::inputNameList->first(); + while (fn) + { + FileDef *fd=fn->first(); + while (fd) + { + if (fd->isLinkableInProject()) + { + if (isFirst) + { + beginRTFChapter(); + isFirst=FALSE; + break; + } + } + fd=fn->next(); + } + fn=Doxygen::inputNameList->next(); + } + } + break; + case isExampleDocumentation: + { + //Example Documentation + beginRTFChapter(); + } + break; + case isPageDocumentation: + { + //Page Documentation + beginRTFChapter(); + } + break; + case isPageDocumentation2: + { + t << "{\\tc \\v "; + } + break; + case isEndIndex: + break; + } +} + +void RTFGenerator::endIndexSection(IndexSections is) +{ + bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + switch (is) + { + case isTitlePageStart: + if (rtf_title) + // User has overridden document title in extensions file + t << "}" << rtf_title; + else + t << "}" << Config_getString("PROJECT_NAME"); + break; + case isTitlePageAuthor: + { + t << "Doxgyen. }\n"; + t << "{\\creatim " << dateToRTFDateString() << "}\n}"; + DBG_RTF(t << "{\\comment end of infoblock}\n"); + // setup for this section + t << rtf_Style_Reset <<"\n"; + t <<"\\sectd\\pgnlcrm\n"; + t <<"{\\footer "<<rtf_Style["Footer"]->reference << "{\\chpgn}}\n"; + // the title entry + DBG_RTF(t << "{\\comment begin title page}\n") + + + t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style + + t << "\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n"; + if (rtf_logoFilename) + { + t << "{\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << rtf_logoFilename; + t << "\" \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n"; + } + if (rtf_company) + { + t << rtf_company << "\\par\\par\n"; + } + + t << rtf_Style_Reset << rtf_Style["Title"]->reference << endl; // set to title style + t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt TITLE}}\\par" << endl; + + t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style + t << "\\par\n"; + if (rtf_documentType) + { + t << rtf_documentType << "\\par\n"; + } + if (rtf_documentId) + { + t << rtf_documentId << "\\par\n"; + } + t << "\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n"; + + t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to subtitle style + t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl; + t << "Version " << Config_getString("PROJECT_NUMBER") << "\\par"; + t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}" + "{\\fldrslt CREATEDATE}}\\par"<<endl; + t << "\\page\\page"; + DBG_RTF(t << "{\\comment End title page}" << endl) + + // table of contents section + DBG_RTF(t << "{\\comment Table of contents}\n") + t << "\\vertalt\n"; + t << rtf_Style_Reset << endl; + t << rtf_Style["Heading1"]->reference; + t << theTranslator->trRTFTableOfContents() << "\\par"<< endl; + t << rtf_Style_Reset << "\\par" << endl; + t << "{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n"; + t << rtf_Style_Reset << endl; + } + break; + case isMainPage: + t << "\\par " << rtf_Style_Reset << endl; + if (!Doxygen::mainPage || Doxygen::mainPage->title().isEmpty()) + { + t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl; + } + else + { + t << "{\\tc \\v " << substitute(Doxygen::mainPage->title(),"%","") << "}"<< endl; + } + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + //if (Config_getBool("GENERATE_TREEVIEW")) t << "main"; else t << "index"; + t << "index"; + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + //case isPackageIndex: + // t << "\\par " << rtf_Style_Reset << endl; + // t << "{\\tc \\v " << theTranslator->trPackageList() << "}"<< endl; + // t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + // break; + case isModuleIndex: + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + case isDirIndex: + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\tc \\v " << theTranslator->trDirIndex() << "}"<< endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"dirs.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + case isNamespaceIndex: + t << "\\par " << rtf_Style_Reset << endl; + if (fortranOpt) + { + t << "{\\tc \\v " << theTranslator->trModulesIndex() << "}" << endl; + } + else + { + t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}" << endl; + } + + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + case isClassHierarchyIndex: + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + case isCompoundIndex: + t << "\\par " << rtf_Style_Reset << endl; + if (fortranOpt) + { + t << "{\\tc \\v " << theTranslator->trCompoundIndexFortran() << "}"<< endl; + } + else if (vhdlOpt) + { + t << "{\\tc \\v " << VhdlDocGen::trDesignUnitIndex() << "}"<< endl; + } + else + { + t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl; + } + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + case isFileIndex: + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + case isPageIndex: + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + break; + case isModuleDocumentation: + { + GroupSDict::Iterator gli(*Doxygen::groupSDict); + GroupDef *gd; + t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl; + for (gli.toFirst();(gd=gli.current());++gli) + { + if (!gd->isReference()) + { + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << gd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + } + } + } + break; + case isDirDocumentation: + { + SDict<DirDef>::Iterator dli(*Doxygen::directories); + DirDef *dd; + t << "{\\tc \\v " << theTranslator->trDirDocumentation() << "}"<< endl; + for (dli.toFirst();(dd=dli.current());++dli) + { + if (dd->isLinkableInProject()) + { + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << dd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + } + } + } + break; + case isNamespaceDocumentation: + { + NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); + NamespaceDef *nd; + bool found=FALSE; + for (nli.toFirst();(nd=nli.current()) && !found;++nli) + { + if (nd->isLinkableInProject()) + { + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << nd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + found=TRUE; + } + } + while ((nd=nli.current())) + { + if (nd->isLinkableInProject()) + { + t << "\\par " << rtf_Style_Reset << endl; + beginRTFSection(); + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << nd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + } + ++nli; + } + } + break; + case isClassDocumentation: + { + ClassSDict::Iterator cli(*Doxygen::classSDict); + ClassDef *cd=0; + bool found=FALSE; + if (fortranOpt) + { + t << "{\\tc \\v " << theTranslator->trTypeDocumentation() << "}"<< endl; + } + else + { + t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}"<< endl; + } + for (cli.toFirst();(cd=cli.current()) && !found;++cli) + { + if (cd->isLinkableInProject() && + cd->templateMaster()==0 && + !cd->isEmbeddedInOuterScope() + ) + { + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << cd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + found=TRUE; + } + } + for (;(cd=cli.current());++cli) + { + if (cd->isLinkableInProject() && + cd->templateMaster()==0 && + !cd->isEmbeddedInOuterScope() + ) + { + t << "\\par " << rtf_Style_Reset << endl; + beginRTFSection(); + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << cd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + } + } + } + break; + case isFileDocumentation: + { + bool isFirst=TRUE; + FileName *fn=Doxygen::inputNameList->first(); + + t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl; + while (fn) + { + FileDef *fd=fn->first(); + while (fd) + { + if (fd->isLinkableInProject()) + { + if (isFirst) + { + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << fd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + isFirst=FALSE; + } + else + { + t << "\\par " << rtf_Style_Reset << endl; + beginRTFSection(); + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << fd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + } + } + fd=fn->next(); + } + fn=Doxygen::inputNameList->next(); + } + } + break; + case isExampleDocumentation: + { + //t << "}\n"; + t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl; + PageSDict::Iterator pdi(*Doxygen::exampleSDict); + PageDef *pd=pdi.toFirst(); + if (pd) + { + t << "\\par " << rtf_Style_Reset << endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << pd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + } + for (++pdi;(pd=pdi.current());++pdi) + { + t << "\\par " << rtf_Style_Reset << endl; + beginRTFSection(); + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << pd->getOutputFileBase(); + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + } + } + break; + case isPageDocumentation: + { +//#error "fix me in the same way as the latex index..." + //t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl; + //t << "}"<< endl; + //PageSDict::Iterator pdi(*Doxygen::pageSDict); + //PageDef *pd=pdi.toFirst(); + //bool first=TRUE; + //for (pdi.toFirst();(pd=pdi.current());++pdi) + //{ + // if (!pd->getGroupDef() && !pd->isReference()) + // { + // if (first) t << "\\par " << rtf_Style_Reset << endl; + // t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + // t << pd->getOutputFileBase(); + // t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; + // first=FALSE; + // } + //} + } + break; + case isPageDocumentation2: + { + t << "}"; + t << "\\par " << rtf_Style_Reset << endl; + } + break; + case isEndIndex: + beginRTFChapter(); + t << rtf_Style["Heading1"]->reference; + t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl; + t << rtf_Style_Reset << endl; + t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl; + t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n"; + + break; + } +} + +void RTFGenerator::writePageLink(const char *name,bool first) +{ + if (first) t << "\\par " << rtf_Style_Reset << endl; + t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; + t << name; + t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; +} + +void RTFGenerator::lastIndexPage() +{ + DBG_RTF(t <<"{\\comment Beginning Body of RTF Document}\n") + // end page and setup for rest of document + t <<"\\sect \\sbkpage \\pgndec \\pgnrestart\n"; + t <<"\\sect \\sectd \\sbknone\n"; + + // set new footer with arabic numbers + t <<"{\\footer "<< rtf_Style["Footer"]->reference << "{\\chpgn}}\n"; + //t << rtf_Style["Heading1"]->reference << "\n"; + +} + +void RTFGenerator::writeStyleInfo(int) +{ +} + +void RTFGenerator::lineBreak(const char *) +{ + DBG_RTF(t << "{\\comment (lineBreak)}" << endl) + t << "\\par" << endl; + m_omitParagraph = TRUE; +} + +void RTFGenerator::writeString(const char *text) +{ + t << text; +} + +void RTFGenerator::startIndexList() +{ + DBG_RTF(t << "{\\comment (startIndexList)}" << endl) + t << "{" << endl; + t << "\\par" << endl; + incrementIndentLevel(); + t << rtf_Style_Reset << rtf_LCList_DepthStyle() << endl; + m_omitParagraph = TRUE; +} + +void RTFGenerator::endIndexList() +{ + DBG_RTF(t << "{\\comment (endIndexList)}" << endl) + if (!m_omitParagraph) + { + t << "\\par"; + m_omitParagraph = TRUE; + } + t << "}"; + decrementIndentLevel(); +} + +/*! start bullet list */ +void RTFGenerator::startItemList() +{ + newParagraph(); + DBG_RTF(t << "{\\comment (startItemList level=" << m_listLevel << ") }" << endl) + t << "{"; + incrementIndentLevel(); + rtf_listItemInfo[m_listLevel].isEnum = FALSE; +} + +/*! end bullet list */ +void RTFGenerator::endItemList() +{ + newParagraph(); + DBG_RTF(t << "{\\comment (endItemList level=" << m_listLevel << ")}" << endl) + t << "}"; + decrementIndentLevel(); + m_omitParagraph = TRUE; +} + +///*! start enumeration list */ +//void RTFGenerator::startEnumList() // starts an enumeration list +//{ +// DBG_RTF(t << "{\\comment (startEnumList)}" << endl) +// t << "{" << endl; +// incrementIndentLevel(); +// rtf_listItemInfo[m_listLevel].isEnum = TRUE; +// rtf_listItemInfo[m_listLevel].number = 1; +//} +// +///*! end enumeration list */ +//void RTFGenerator::endEnumList() +//{ +// newParagraph(); +// DBG_RTF(t << "{\\comment (endEnumList)}" << endl) +// t << "}"; +// decrementIndentLevel(); +// m_omitParagraph = TRUE; +//} + +/*! write bullet or enum item */ +void RTFGenerator::startItemListItem() +{ + DBG_RTF(t << "{\\comment (startItemListItem)}" << endl) + newParagraph(); + t << rtf_Style_Reset; + if (rtf_listItemInfo[m_listLevel].isEnum) + { + t << rtf_EList_DepthStyle() << endl; + t << rtf_listItemInfo[m_listLevel].number << ".\\tab "; + rtf_listItemInfo[m_listLevel].number++; + } + else + { + t << rtf_BList_DepthStyle() << endl; + } + m_omitParagraph = TRUE; +} + +void RTFGenerator::endItemListItem() +{ + DBG_RTF(t << "{\\comment (endItemListItem)}" << endl) +} + +void RTFGenerator::startIndexItem(const char *,const char *) +{ + DBG_RTF(t << "{\\comment (startIndexItem)}" << endl) + + if (!m_omitParagraph) + { + t << "\\par" << endl; + m_omitParagraph = TRUE; + } +} + +void RTFGenerator::endIndexItem(const char *ref,const char *fn) +{ + DBG_RTF(t << "{\\comment (endIndexItem)}" << endl) + if (!ref && fn) + { + t << "\\tab "; + writeRTFReference(fn); + t << endl; + } + else + { + t << endl; + } + m_omitParagraph = TRUE; +} + +//void RTFGenerator::writeIndexFileItem(const char *,const char *text) +//{ +// t << "\\item\\contentsline{section}{"; +// docify(text); +// t << "}{\\pageref{" << text << "}}" << endl; +//} + +void RTFGenerator::startHtmlLink(const char *url) +{ + + if (Config_getBool("RTF_HYPERLINKS")) + { + t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; + t << url; + t << "\" }{}"; + t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; + } + else + { + startTypewriter(); + } +} + +void RTFGenerator::endHtmlLink() +{ + if (Config_getBool("RTF_HYPERLINKS")) + { + t << "}}}" << endl; + } + else + { + endTypewriter(); + } +} + +//void RTFGenerator::writeMailLink(const char *url) +//{ +// startTypewriter(); +// docify(url); +// endTypewriter(); +//} + +void RTFGenerator::writeStartAnnoItem(const char *,const char *f, + const char *path,const char *name) +{ + DBG_RTF(t << "{\\comment (writeStartAnnoItem)}" << endl) + t << "{\\b "; + if (path) docify(path); + if (f && Config_getBool("RTF_HYPERLINKS")) + { + t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; + t << rtfFormatBmkStr(f); + t << "\" }{}"; + t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; + + docify(name); + + t << "}}}" << endl; + } + else + { + docify(name); + } + t << "} "; +} + +void RTFGenerator::writeEndAnnoItem(const char *name) +{ + DBG_RTF(t << "{\\comment (writeEndAnnoItem)}" << endl) + if (name) + { + t << "\\tab "; + writeRTFReference(name); + t << endl; + } + else + { + t << endl; + } + newParagraph(); +} + +void RTFGenerator::startIndexKey() +{ + DBG_RTF(t << "{\\comment (startIndexKey)}" << endl) + t << "{\\b "; +} + +void RTFGenerator::endIndexKey() +{ + DBG_RTF(t << "{\\comment (endIndexKey)}" << endl) +} + +void RTFGenerator::startIndexValue(bool hasBrief) +{ + DBG_RTF(t << "{\\comment (startIndexValue)}" << endl) + t << " "; + if (hasBrief) t << "("; +} + +void RTFGenerator::endIndexValue(const char *name,bool hasBrief) +{ + DBG_RTF(t << "{\\comment (endIndexValue)}" << endl) + if (hasBrief) t << ")"; + t << "} "; + if (name) + { + t << "\\tab "; + writeRTFReference(name); + t << endl; + } + else + { + t << endl; + } + m_omitParagraph=FALSE; + newParagraph(); +} + +void RTFGenerator::startSubsection() +{ + //beginRTFSubSection(); + t <<"\n"; + DBG_RTF(t << "{\\comment Begin SubSection}\n") + t << rtf_Style_Reset; + t << rtf_Style["Heading3"]->reference << "\n"; +} + +void RTFGenerator::endSubsection() +{ + newParagraph(); + t << rtf_Style_Reset << endl; +} + +void RTFGenerator::startSubsubsection() +{ + //beginRTFSubSubSection(); + t << "\n"; + DBG_RTF(t << "{\\comment Begin SubSubSection}\n") + t << "{" << endl; + t << rtf_Style_Reset << rtf_Style["Heading4"]->reference << "\n"; +} + +void RTFGenerator::endSubsubsection() +{ + newParagraph(); + t << "}" << endl; +} + + +//void RTFGenerator::writeClassLink(const char *,const char *, +// const char *,const char *name) +//{ +// t << "{\\bf "; +// docify(name); +// t << "}"; +//} + +//void RTFGenerator::startTable(bool,int colNumbers) +//{ +// DBG_RTF(t << "{\\comment startTable}\n";) +// m_numCols=colNumbers; +// t << "\\par\n"; +//} +// +//void RTFGenerator::endTable(bool hasCaption) +//{ +// DBG_RTF(t << "{\\comment endTable}\n";) +// if (!hasCaption) +// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n"; +// t << "\\pard\n" << endl; +//} +// +//void RTFGenerator::startCaption() +//{ +// DBG_RTF(t << "{\\comment startCaption}\n";) +// endTableRow(); +// t << "\\trowd \\trgaph108\\trleft-108\\trbrdrt\\brdrs\\brdrw10 \\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 \\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\\brdrs\\brdrw10 \\trbrdrv\\brdrs\\brdrw10" << endl; +// t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 \\clbrdrl\\brdrs\\brdrw10 \\clbrdrb\\brdrs\\brdrw10 \\clbrdrr \\brdrs\\brdrw10 \\cltxlrtb \\cellx"<<rtf_pageWidth<<"\\pard \\qc\\nowidctlpar\\widctlpar\\intbl\\adjustright " << endl; +// nextTableColumn(); +//} +// +//void RTFGenerator::endCaption() +//{ +// DBG_RTF(t << "{\\comment endCaption}\n";) +// endTableColumn(); +// endTableRow(); +//} +// +//void RTFGenerator::nextTableRow() +//{ +// DBG_RTF(t << "{\\comment nextTableRow}\n";) +// ASSERT(m_numCols>0 && m_numCols<25); +// uint columnWidth=rtf_pageWidth/m_numCols; +// t << "\\trowd \\trgaph108\\trleft-108\\trbrdrt\\brdrs\\brdrw10 " +// "\\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 " +// "\\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\\brdrs\\brdrw10 " +// "\\trbrdrv\\brdrs\\brdrw10 "<<endl; +// for (int i=0;i<m_numCols;i++) +// { +// t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 \\clbrdrl\\brdrs\\brdrw10 " +// "\\clbrdrb\\brdrs\\brdrw10 \\clbrdrr \\brdrs\\brdrw10 \\cltxlrtb " +// "\\cellx" << (i*columnWidth) << endl; +// } +// t << "\\pard \\widctlpar\\intbl\\adjustright\n{"; +//} +// +//void RTFGenerator::endTableRow() +//{ +// DBG_RTF(t << "{\\comment endTableRow}\n";) +// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n"; +//} +// +//void RTFGenerator::nextTableColumn() +//{ +// DBG_RTF(t << "{\\comment nextTableColumn}\n";) +// t << "{ "; +//} +// +//void RTFGenerator::endTableColumn() +//{ +// DBG_RTF(t << "{\\comment endTableColumn}\n";) +// t << " \\cell }"; +//} +// +void RTFGenerator::startTextLink(const char *f,const char *anchor) +{ + if (Config_getBool("RTF_HYPERLINKS")) + { + QCString ref; + if (f) + { + ref+=f; + } + if (anchor) + { + ref+='_'; + ref+=anchor; + } + + t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; + t << rtfFormatBmkStr(ref); + t << "\" }{}"; + t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; + } +} + +void RTFGenerator::endTextLink() +{ + if (Config_getBool("RTF_HYPERLINKS")) + { + t << "}}}" << endl; + } +} + +void RTFGenerator::writeObjectLink(const char *ref, const char *f, + const char *anchor, const char *text) +{ + if (!ref && Config_getBool("RTF_HYPERLINKS")) + { + QCString refName; + if (f) + { + refName+=f; + } + if (anchor) + { + refName+='_'; + refName+=anchor; + } + + t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; + t << rtfFormatBmkStr(refName); + t << "\" }{}"; + t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; + + docify(text); + + t << "}}}" << endl; + } + else + { + startBold(); + docify(text); + endBold(); + } +} + +void RTFGenerator::startPageRef() +{ + t << " ("; + startEmphasis(); +} + +void RTFGenerator::endPageRef(const char *clname, const char *anchor) +{ + QCString ref; + if (clname) + { + ref+=clname; + } + if (anchor) + { + ref+='_'; + ref+=anchor; + } + writeRTFReference(ref); + endEmphasis(); + t << ")"; +} + +void RTFGenerator::writeCodeLink(const char *ref,const char *f, + const char *anchor,const char *name, + const char *) +{ + if (!ref && Config_getBool("RTF_HYPERLINKS")) + { + QCString refName; + if (f) + { + refName+=f; + } + if (anchor) + { + refName+='_'; + refName+=anchor; + } + + t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; + t << rtfFormatBmkStr(refName); + t << "\" }{}"; + t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; + + codify(name); + + t << "}}}" << endl; + } + else + { + codify(name); + } +} + +void RTFGenerator::startTitleHead(const char *) +{ + DBG_RTF(t <<"{\\comment startTitleHead}" << endl) + + // beginRTFSection(); + t << rtf_Style_Reset << rtf_Style["Heading2"]->reference << endl; +} + +void RTFGenerator::endTitleHead(const char *fileName,const char *name) +{ + DBG_RTF(t <<"{\\comment endTitleHead}" << endl) + t << "\\par " << rtf_Style_Reset << endl; + if (name) + { + // make table of contents entry + t << "{\\tc\\tcl2 \\v "; + docify(name); + t << "}" << endl; + + // make an index entry + addIndexItem(name,0); + + //if (name) + //{ + // writeAnchor(0,name); + //} + // + //if (Config_getBool("RTF_HYPERLINKS") && fileName) + //{ + writeAnchor(fileName,0); + //} + } +} + +void RTFGenerator::startTitle() +{ + DBG_RTF(t <<"{\\comment startTitle}" << endl) + if (Config_getBool("COMPACT_RTF")) + beginRTFSection(); + else + beginRTFChapter(); +} + +void RTFGenerator::startGroupHeader(int extraIndent) +{ + DBG_RTF(t <<"{\\comment startGroupHeader}" << endl) + //newParagraph(); + t << rtf_Style_Reset; + if (extraIndent==2) + { + t << rtf_Style["Heading5"]->reference; + } + else if (extraIndent==1) + { + t << rtf_Style["Heading4"]->reference; + } + else // extraIndent==0 + { + t << rtf_Style["Heading3"]->reference; + } + t << endl; +} + +void RTFGenerator::endGroupHeader(int) +{ + DBG_RTF(t <<"{\\comment endGroupHeader}" << endl) + t << "\\par" << endl; + t << rtf_Style_Reset << endl; +} + +void RTFGenerator::startMemberDoc(const char *clname, + const char *memname, + const char *, + const char *, + bool showInline) +{ + DBG_RTF(t << "{\\comment startMemberDoc}" << endl) + if (memname && memname[0]!='@') + { + addIndexItem(memname,clname); + addIndexItem(clname,memname); + } + t << rtf_Style_Reset << rtf_Style[showInline ? "Heading5" : "Heading4"]->reference; + //styleStack.push(rtf_Style_Heading4); + t << "{" << endl; + //printf("RTFGenerator::startMemberDoc() `%s'\n",rtf_Style["Heading4"]->reference); + startBold(); + t << endl; +} + +void RTFGenerator::endMemberDoc(bool) +{ + DBG_RTF(t << "{\\comment endMemberDoc}" << endl) + //const char *style = styleStack.pop(); + //printf("RTFGenerator::endMemberDoc() `%s'\n",style); + //ASSERT(style==rtf_Style["Heading4"]->reference); + endBold(); + t << "}" << endl; + newParagraph(); +} + +void RTFGenerator::startDoxyAnchor(const char *,const char *, + const char *,const char *, + const char * + ) +{ + DBG_RTF(t << "{\\comment startDoxyAnchor}" << endl) +} + +void RTFGenerator::endDoxyAnchor(const char *fName,const char *anchor) +{ + QCString ref; + if (fName) + { + ref+=fName; + } + if (anchor) + { + ref+='_'; + ref+=anchor; + } + + DBG_RTF(t << "{\\comment endDoxyAnchor}" << endl) + t << "{\\bkmkstart "; + t << rtfFormatBmkStr(ref); + t << "}" << endl; + t << "{\\bkmkend "; + t << rtfFormatBmkStr(ref); + t << "}" << endl; +} + + +//void RTFGenerator::writeLatexLabel(const char *clName,const char *anchor) +//{ +// writeDoxyAnchor(0,clName,anchor,0); +//} + +void RTFGenerator::addIndexItem(const char *s1,const char *s2) +{ + if (s1) + { + t << "{\\xe \\v "; + docify(s1); + if (s2) + { + t << "\\:"; + docify(s2); + } + t << "}" << endl; + } +} + +void RTFGenerator::startIndent() +{ + incrementIndentLevel(); + DBG_RTF(t << "{\\comment (startIndent) }" << endl) + t << "{" << endl; + t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl; +} + +void RTFGenerator::endIndent() +{ + t << "}" << endl; + decrementIndentLevel(); +} + + +void RTFGenerator::startDescription() +{ + DBG_RTF(t << "{\\comment (startDescription)}" << endl) + t << "{" << endl; + t << rtf_Style_Reset << rtf_DList_DepthStyle(); +} + +void RTFGenerator::endDescription() +{ + DBG_RTF(t << "{\\comment (endDescription)}" << endl) + newParagraph(); + t << "}"; +} + +void RTFGenerator::startDescItem() +{ + newParagraph(); + DBG_RTF(t << "{\\comment (startDescItem)}" << endl) + t << "{\\b "; +} + +void RTFGenerator::endDescItem() +{ + DBG_RTF(t << "{\\comment (endDescItem)}" << endl) + t << "}" << endl; + newParagraph(); +} + +void RTFGenerator::startMemberDescription(const char *,const char *) +{ + DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl) + t << "{" << endl; + incrementIndentLevel(); + t << rtf_Style_Reset << rtf_CList_DepthStyle(); + startEmphasis(); +} + +void RTFGenerator::endMemberDescription() +{ + DBG_RTF(t << "{\\comment (endMemberDescription)}" << endl) + endEmphasis(); + newParagraph(); + decrementIndentLevel(); + //t << "\\par"; + t << "}" << endl; + //m_omitParagraph = TRUE; +} + +void RTFGenerator::startDescList(SectionTypes) +{ + DBG_RTF(t << "{\\comment (startDescList)}" << endl) + t << "{"; // ends at endDescList + t << "{"; // ends at endDescTitle + startBold(); + newParagraph(); +} + +//void RTFGenerator::endDescTitle() +//{ +// DBG_RTF(t << "{\\comment (endDescTitle) }" << endl) +// endBold(); +// t << "}"; +// newParagraph(); +// incrementIndentLevel(); +// t << rtf_Style_Reset << rtf_DList_DepthStyle(); +//} + +void RTFGenerator::startDescForItem() +{ + DBG_RTF(t << "{\\comment (startDescForItem) }" << endl) +} + +void RTFGenerator::endDescForItem() +{ + DBG_RTF(t << "{\\comment (endDescForItem) }" << endl) +} + +//void RTFGenerator::endDescList() +//{ +// DBG_RTF(t << "{\\comment (endDescList)}" << endl) +// newParagraph(); +// decrementIndentLevel(); +// m_omitParagraph = TRUE; +// t << "}"; +//} + + +void RTFGenerator::startSection(const char *,const char *title,SectionInfo::SectionType type) +{ + DBG_RTF(t << "{\\comment (startSection)}" << endl) + t << "{"; + t<< rtf_Style_Reset; + int num=4; + switch(type) + { + case SectionInfo::Page: num=2; break; + case SectionInfo::Section: num=3; break; + case SectionInfo::Subsection: num=4; break; + case SectionInfo::Subsubsection: num=4; break; + case SectionInfo::Paragraph: num=4; break; + default: ASSERT(0); break; + } + QCString heading; + heading.sprintf("Heading%d",num); + // set style + t << rtf_Style[heading]->reference; + // make table of contents entry + t << "{\\tc\\tcl" << num << " \\v "; + docify(title); + t << "}" << endl; +} + +void RTFGenerator::endSection(const char *lab,SectionInfo::SectionType) +{ + DBG_RTF(t << "{\\comment (endSection)}" << endl) + // make bookmark + m_omitParagraph=FALSE; + newParagraph(); + writeAnchor(0,lab); + t << "}"; +} + +//void RTFGenerator::writeSectionRef(const char *ref,const char *, +// const char *lab,const char *title) +//{ +// if (ref) +// { +// docify(title); +// } +// else +// { +// startBold(); +// docify(title); +// endBold(); +// t << " ("; +// docify(theTranslator->trPageAbbreviation()); +// writeRTFReference(lab); +// t << ")" << endl; +// } +//} +// +//void RTFGenerator::writeSectionRefItem(const char *,const char *lab, +// const char *title) +//{ +// docify(title); +// t << "\\tab"; +// writeRTFReference(lab); +// t << endl; +//} +// +//void RTFGenerator::writeSectionRefAnchor(const char *name,const char *lab, +// const char *title) +//{ +// writeSectionRef(name,lab,title); +//} + +//char* RTFGenerator::getMultiByte(int c) +//{ +// static char s[10]; +// +// sprintf(s,"\\'%X",c); +// return s; +//} + +void RTFGenerator::docify(const char *str) +{ + if (str) + { + const unsigned char *p=(const unsigned char *)str; + unsigned char c; + //unsigned char pc='\0'; + while (*p) + { + //static bool MultiByte = FALSE; + c=*p++; + +#if 0 + if ( MultiByte ) + { + t << getMultiByte( c ); + MultiByte = FALSE; + continue; + } + if ( c >= 0x80 ) + { + MultiByte = TRUE; + t << getMultiByte( c ); + continue; + } +#endif + + switch (c) + { + case '{': t << "\\{"; break; + case '}': t << "\\}"; break; + case '\\': t << "\\\\"; break; + default: + { + // see if we can insert an hyphenation hint + //if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + //pc = c; + m_omitParagraph = FALSE; + } + } +} + +void RTFGenerator::codify(const char *str) +{ + // note that RTF does not have a "verbatim", so "\n" means + // nothing... add a "newParagraph()"; + //static char spaces[]=" "; + if (str) + { + const unsigned char *p=(const unsigned char *)str; + unsigned char c; + int spacesToNextTabStop; + + while (*p) + { + //static bool MultiByte = FALSE; + + c=*p++; + +#if 0 + if( MultiByte ) + { + t << getMultiByte( c ); + MultiByte = FALSE; + continue; + } + if( c >= 0x80 ) + { + MultiByte = TRUE; + t << getMultiByte( c ); + continue; + } +#endif + + switch(c) + { + case '\t': spacesToNextTabStop = Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE")); + t << Doxygen::spaces.left(spacesToNextTabStop); + col+=spacesToNextTabStop; + break; + case '\n': newParagraph(); + t << '\n'; col=0; + break; + case '{': t << "\\{"; col++; break; + case '}': t << "\\}"; col++; break; + case '\\': t << "\\\\"; col++; break; + default: t << (char)c; col++; break; + } + } + } +} + +void RTFGenerator::writeChar(char c) +{ + char cs[2]; + cs[0]=c; + cs[1]=0; + docify(cs); +} + +void RTFGenerator::startClassDiagram() +{ + DBG_RTF(t <<"{\\comment startClassDiagram }" << endl) +} + +void RTFGenerator::endClassDiagram(const ClassDiagram &d, + const char *fileName,const char *) +{ + newParagraph(); + + // create a png file + d.writeImage(t,dir,relPath,fileName,FALSE); + + // display the file + t << "{" << endl; + t << rtf_Style_Reset << endl; + t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + t << fileName << ".png\""; + t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << "}" << endl; +} + +//void RTFGenerator::writeFormula(const char *,const char *text) +//{ +// t << text; +//} + +void RTFGenerator::startMemberItem(const char *,int,const char *) +{ + DBG_RTF(t <<"{\\comment startMemberItem }" << endl) + t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl; // set style to appropriate depth +} + +void RTFGenerator::endMemberItem() +{ + DBG_RTF(t <<"{\\comment endMemberItem }" << endl) + newParagraph(); +} + +void RTFGenerator::writeAnchor(const char *fileName,const char *name) +{ + QCString anchor; + if (fileName) + { + anchor+=fileName; + } + if (fileName && name) + { + anchor+='_'; + } + if (name) + { + anchor+=name; + } + + DBG_RTF(t <<"{\\comment writeAnchor (" << anchor << ")}" << endl) + t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl; + t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}" << endl; +} + +void RTFGenerator::writeRTFReference(const char *label) +{ + t << "{\\field\\fldedit {\\*\\fldinst PAGEREF "; + t << rtfFormatBmkStr(label); + t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}"; +} + +void RTFGenerator::startCodeFragment() +{ + DBG_RTF(t << "{\\comment (startCodeFragment) }" << endl) + t << "{" << endl; + //newParagraph(); + t << rtf_Style_Reset << rtf_Code_DepthStyle(); + //styleStack.push(rtf_Style_CodeExample); +} + +void RTFGenerator::endCodeFragment() +{ + //newParagraph(); + //styleStack.pop(); + //printf("RTFGenerator::endCodeFrament() top=%s\n",styleStack.top()); + //t << rtf_Style_Reset << styleStack.top() << endl; + DBG_RTF(t << "{\\comment (endCodeFragment) }" << endl) + t << "}" << endl; + m_omitParagraph = TRUE; +} + +void RTFGenerator::writeNonBreakableSpace(int) +{ + t << "\\~ "; +} + + +void RTFGenerator::startMemberList() +{ + t << endl; + DBG_RTF(t << "{\\comment (startMemberList) }" << endl) + t << "{" << endl; +#ifdef DELETEDCODE + if (!insideTabbing) + t << "\\begin{CompactItemize}" << endl; +#endif +} + +void RTFGenerator::endMemberList() +{ + DBG_RTF(t << "{\\comment (endMemberList) }" << endl) + t << "}" << endl; +#ifdef DELETEDCODE + if (!insideTabbing) + t << "\\end{CompactItemize}" << endl; +#endif +} + +//void RTFGenerator::startImage(const char *name,const char *,bool) +//{ +// newParagraph(); +// t << "{" << endl; +// t << rtf_Style_Reset << endl; +// t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; +// t << name; +// t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; +// t << "}" << endl; +//} +// +//void RTFGenerator::endImage(bool) +//{ +// // not yet implemented +//} +// +//void RTFGenerator::startDotFile(const char *name,bool) +//{ +// QCString baseName=name; +// int i; +// if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1) +// { +// baseName=baseName.right(baseName.length()-i-1); +// } +// QCString outDir = Config_getString("RTF_OUTPUT"); +// writeDotGraphFromFile(name,outDir,baseName,BITMAP); +// newParagraph(); +// t << "{" << endl; +// t << rtf_Style_Reset << endl; +// t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; +// t << outDir << "\\" << baseName; +// t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; +// t << "}" << endl; +//} +// +//void RTFGenerator::endDotFile(bool) +//{ +// // not yet implemented +//} +// +void RTFGenerator::startDescTable() +{ + DBG_RTF(t << "{\\comment (startDescTable) }" << endl) + //t << "{" << endl; + //incrementIndentLevel(); + //t << rtf_Style_Reset << rtf_CList_DepthStyle(); +} + +void RTFGenerator::endDescTable() +{ + //decrementIndentLevel(); + DBG_RTF(t << "{\\comment (endDescTable)}" << endl) + //t << "}" << endl; + //t << rtf_Style_Reset << styleStack.top(); +} + +void RTFGenerator::startDescTableTitle() +{ + //t << rtf_BList_DepthStyle() << endl; + DBG_RTF(t << "{\\comment (startDescTableTitle) }" << endl) + startBold(); + startEmphasis(); +} + +void RTFGenerator::endDescTableTitle() +{ + DBG_RTF(t << "{\\comment (endDescTableTitle) }" << endl) + endEmphasis(); + endBold(); + t << " "; +} + +void RTFGenerator::startDescTableData() +{ + DBG_RTF(t << "{\\comment (startDescTableData) }" << endl) + m_omitParagraph = FALSE; +} + +void RTFGenerator::endDescTableData() +{ + DBG_RTF(t << "{\\comment (endDescTableData) }" << endl) + newParagraph(); + m_omitParagraph = TRUE; +} + +// a style for list formatted as a "bulleted list" + +void RTFGenerator::incrementIndentLevel() +{ + m_listLevel++; + if (m_listLevel>rtf_maxIndentLevels-1) + { + err("error: Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels); + m_listLevel=rtf_maxIndentLevels-1; + } +} + +void RTFGenerator::decrementIndentLevel() +{ + m_listLevel--; + if (m_listLevel<0) + { + err("error: Negative indent level while generating RTF output!\n"); + m_listLevel=0; + } +} + +// a style for list formatted with "list continue" style +const char * RTFGenerator::rtf_CList_DepthStyle() +{ + QCString n=makeIndexName("ListContinue",m_listLevel); + return rtf_Style[n]->reference; +} + +// a style for list formatted as a "latext style" table of contents +const char * RTFGenerator::rtf_LCList_DepthStyle() +{ + QCString n=makeIndexName("LatexTOC",m_listLevel); + return rtf_Style[n]->reference; +} + +// a style for list formatted as a "bullet" style +const char * RTFGenerator::rtf_BList_DepthStyle() +{ + QCString n=makeIndexName("ListBullet",m_listLevel); + return rtf_Style[n]->reference; +} + +// a style for list formatted as a "enumeration" style +const char * RTFGenerator::rtf_EList_DepthStyle() +{ + QCString n=makeIndexName("ListEnum",m_listLevel); + return rtf_Style[n]->reference; +} + +const char * RTFGenerator::rtf_DList_DepthStyle() +{ + QCString n=makeIndexName("DescContinue",m_listLevel); + return rtf_Style[n]->reference; +} + +const char * RTFGenerator::rtf_Code_DepthStyle() +{ + QCString n=makeIndexName("CodeExample",m_listLevel); + return rtf_Style[n]->reference; +} + +void RTFGenerator::startTextBlock(bool dense) +{ + DBG_RTF(t << "{\\comment startTextBlock}" << endl) + t << "{" << endl; + t << rtf_Style_Reset; + if (dense) // no spacing between "paragraphs" + { + t << rtf_Style["DenseText"]->reference; + } + else // some spacing + { + t << rtf_Style["BodyText"]->reference; + } +} + +void RTFGenerator::endTextBlock(bool /*paraBreak*/) +{ + newParagraph(); + DBG_RTF(t << "{\\comment endTextBlock}" << endl) + t << "}" << endl; + //m_omitParagraph = TRUE; +} + +void RTFGenerator::newParagraph() +{ + if (!m_omitParagraph) + { + DBG_RTF(t << "{\\comment (newParagraph)}" << endl) + t << "\\par" << endl; + } + m_omitParagraph = FALSE; +} + +void RTFGenerator::startParagraph() +{ + DBG_RTF(t << "{\\comment startParagraph}" << endl) + newParagraph(); + t << "{" << endl; +} + +void RTFGenerator::endParagraph() +{ + DBG_RTF(t << "{\\comment endParagraph}" << endl) + t << "}\\par" << endl; + m_omitParagraph = TRUE; +} + +void RTFGenerator::startMemberSubtitle() +{ + DBG_RTF(t << "{\\comment startMemberSubtitle}" << endl) + t << "{" << endl; + t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl; +} + +void RTFGenerator::endMemberSubtitle() +{ + DBG_RTF(t << "{\\comment endMemberSubtitle}" << endl) + newParagraph(); + t << "}" << endl; +} + +//void RTFGenerator::writeUmlaut(char c) +//{ +// switch(c) +// { +// case 'A' : t << '\304'; break; +// case 'E' : t << '\313'; break; +// case 'I' : t << '\317'; break; +// case 'O' : t << '\326'; break; +// case 'U' : t << '\334'; break; +// case 'Y' : t << 'Y'; break; +// case 'a' : t << '\344'; break; +// case 'e' : t << '\353'; break; +// case 'i' : t << '\357'; break; +// case 'o' : t << '\366'; break; +// case 'u' : t << '\374'; break; +// case 'y' : t << '\377'; break; +// default: t << '?'; break; +// } +//} +// +//void RTFGenerator::writeAcute(char c) +//{ +// switch(c) +// { +// case 'A' : t << '\301'; break; +// case 'E' : t << '\311'; break; +// case 'I' : t << '\315'; break; +// case 'O' : t << '\323'; break; +// case 'U' : t << '\332'; break; +// case 'Y' : t << '\335'; break; +// case 'a' : t << '\341'; break; +// case 'e' : t << '\351'; break; +// case 'i' : t << '\355'; break; +// case 'o' : t << '\363'; break; +// case 'u' : t << '\372'; break; +// case 'y' : t << '\375'; break; +// default: t << '?'; break; +// } +//} +// +//void RTFGenerator::writeGrave(char c) +//{ +// switch(c) +// { +// case 'A' : t << '\300'; break; +// case 'E' : t << '\310'; break; +// case 'I' : t << '\314'; break; +// case 'O' : t << '\322'; break; +// case 'U' : t << '\331'; break; +// case 'a' : t << '\340'; break; +// case 'e' : t << '\350'; break; +// case 'i' : t << '\354'; break; +// case 'o' : t << '\362'; break; +// case 'u' : t << '\371'; break; +// default: t << '?'; break; +// } +//} +// +//void RTFGenerator::writeCirc(char c) +//{ +// switch(c) +// { +// case 'A' : t << '\302'; break; +// case 'E' : t << '\312'; break; +// case 'I' : t << '\316'; break; +// case 'O' : t << '\324'; break; +// case 'U' : t << '\333'; break; +// case 'a' : t << '\342'; break; +// case 'e' : t << '\352'; break; +// case 'i' : t << '\356'; break; +// case 'o' : t << '\364'; break; +// case 'u' : t << '\373'; break; +// default: t << '?'; break; +// } +//} +// +//void RTFGenerator::writeTilde(char c) +//{ +// switch(c) +// { +// case 'A' : t << '\303'; break; +// case 'N' : t << '\321'; break; +// case 'O' : t << '\325'; break; +// case 'a' : t << '\343'; break; +// case 'n' : t << '\361'; break; +// case 'o' : t << '\365'; break; +// default: t << '?'; break; +// } +//} +// +//void RTFGenerator::writeRing(char c) +//{ +// switch(c) +// { +// case 'A' : t << '\305'; break; +// case 'a' : t << '\345'; break; +// default: t << '?'; break; +// } +//} +// +//void RTFGenerator::writeCCedil(char c) +//{ +// switch(c) +// { +// case 'C' : t << '\307'; break; +// case 'c' : t << '\347'; break; +// default: t << '?'; break; +// } +//} +// + +bool isLeadBytes(int c) +{ + bool result; + + QCString codePage = theTranslator->trRTFansicp(); + + if (codePage == "932") // cp932 (Japanese Shift-JIS) + { + result = (0x81<=c && c<=0x9f) || (0xe0<=c && c<=0xfc); + } + else if (codePage == "936") // cp936 (Simplified Chinese GBK) + { + result = 0x81<=c && c<=0xFE; + } + else if (codePage == "949") // cp949 (Korean) + { + result = 0x81<=c && c<=0xFE; + } + else if (codePage == "950") // cp950 (Traditional Chinese Big5) + { + result = 0x81<=c && c<=0xFE; + } + else // for SBCS Codepages (cp1252,1251 etc...) + { + result = false; + } + + return result; +} + + +// note: function is not reentrant! +static void encodeForOutput(FTextStream &t,const QCString &s) +{ + QCString encoding; + bool converted=FALSE; + int l = s.length(); + static QByteArray enc; + if (l*4>(int)enc.size()) enc.resize(l*4); // worst case + encoding.sprintf("CP%s",theTranslator->trRTFansicp().data()); + if (!encoding.isEmpty()) + { + // convert from UTF-8 back to the output encoding + void *cd = portable_iconv_open(encoding,"UTF-8"); + if (cd!=(void *)(-1)) + { + size_t iLeft=l; + size_t oLeft=enc.size(); + char *inputPtr = s.data(); + char *outputPtr = enc.data(); + if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft)) + { + enc.resize(enc.size()-oLeft); + converted=TRUE; + } + portable_iconv_close(cd); + } + } + if (!converted) // if we did not convert anything, copy as is. + { + memcpy(enc.data(),s.data(),l); + enc.resize(l); + } + uint i; + bool multiByte = FALSE; + + for (i=0;i<enc.size();i++) + { + uchar c = (uchar)enc.at(i); + + if (c>=0x80 || multiByte) + { + char esc[10]; + sprintf(esc,"\\'%X",c); // escape sequence for SBCS and DBCS(1st&2nd bytes). + t << esc; + + if (!multiByte) + { + multiByte = isLeadBytes(c); // It may be DBCS Codepages. + } + else + { + multiByte = FALSE; // end of Double Bytes Character. + } + } + else + { + t << (char)c; + } + } +} + +/** + * VERY brittle routine inline RTF's included by other RTF's. + * it is recursive and ugly. + */ +static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncludeHeader=TRUE) +{ + QFile f(infName); + if (!f.open(IO_ReadOnly)) + { + err("error: problems opening rtf file %s for reading\n",infName.data()); + return FALSE; + } + + const int maxLineLength = 10240; + static QCString lineBuf(maxLineLength); + + // scan until find end of header + // this is EXTREEEEEEEMLY brittle. It works on OUR rtf + // files because the first line before the body + // ALWAYS contains "{\comment begin body}" + do + { + if (f.readLine(lineBuf.data(),maxLineLength)==-1) + { + err("ERROR - read error in %s before end of RTF header!\n",infName.data()); + return FALSE; + } + if (bIncludeHeader) encodeForOutput(t,lineBuf); + } while (lineBuf.find("\\comment begin body")==-1); + + + while (f.readLine(lineBuf.data(),maxLineLength)!=-1) + { + int pos; + if ((pos=lineBuf.find("INCLUDETEXT"))!=-1) + { + int startNamePos = lineBuf.find('"',pos)+1; + int endNamePos = lineBuf.find('"',startNamePos); + QCString fileName = lineBuf.mid(startNamePos,endNamePos-startNamePos); + DBG_RTF(t << "{\\comment begin include " << fileName << "}" << endl) + if (!preProcessFile(d,fileName,t,FALSE)) return FALSE; + DBG_RTF(t << "{\\comment end include " << fileName << "}" << endl) + } + else // no INCLUDETEXT on this line + { + // elaborate hoopla to skip the final "}" if we didn't include the + // headers + if (!f.atEnd() || bIncludeHeader) + { + encodeForOutput(t,lineBuf); + } + else // last line of included file + { + // null terminate at the last '}' + //char *str = strrchr(buffer,'}'); + int pos = lineBuf.findRev('}'); + + if (pos != -1) + lineBuf.at(pos) = '\0'; + else + err("Strange, the last char was not a '}'\n"); + encodeForOutput(t,lineBuf); + } + } + } + f.close(); + // remove temporary file + d.remove(infName); + return TRUE; +} + +void RTFGenerator::startDotGraph() +{ + DBG_RTF(t << "{\\comment (startDotGraph)}" << endl) +} + +void RTFGenerator::endDotGraph(const DotClassGraph &g) +{ + newParagraph(); + + QCString fn = + g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE); + + // display the file + t << "{" << endl; + t << rtf_Style_Reset << endl; + t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT"); + t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << "}" << endl; + newParagraph(); + DBG_RTF(t << "{\\comment (endDotGraph)}" << endl) +} + +void RTFGenerator::startInclDepGraph() +{ + DBG_RTF(t << "{\\comment (startInclDepGraph)}" << endl) +} + +void RTFGenerator::endInclDepGraph(const DotInclDepGraph &g) +{ + newParagraph(); + + QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + fileName,relPath,FALSE); + + // display the file + t << "{" << endl; + t << rtf_Style_Reset << endl; + t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT"); + t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << "}" << endl; + DBG_RTF(t << "{\\comment (endInclDepGraph)}" << endl) +} + +void RTFGenerator::startGroupCollaboration() +{ +} + +void RTFGenerator::endGroupCollaboration(const DotGroupCollaboration &) +{ +} + +void RTFGenerator::startCallGraph() +{ + DBG_RTF(t << "{\\comment (startCallGraph)}" << endl) +} + +void RTFGenerator::endCallGraph(const DotCallGraph &g) +{ + newParagraph(); + + QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + fileName,relPath,FALSE); + + // display the file + t << "{" << endl; + t << rtf_Style_Reset << endl; + t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT"); + t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << "}" << endl; + DBG_RTF(t << "{\\comment (endCallGraph)}" << endl) +} + +void RTFGenerator::startDirDepGraph() +{ + DBG_RTF(t << "{\\comment (startDirDepGraph)}" << endl) +} + +void RTFGenerator::endDirDepGraph(const DotDirDeps &g) +{ + newParagraph(); + + QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + fileName,relPath,FALSE); + + // display the file + t << "{" << endl; + t << rtf_Style_Reset << endl; + t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT"); + t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << "}" << endl; + DBG_RTF(t << "{\\comment (endDirDepGraph)}" << endl) +} + +/** Tests the integrity of the result by counting brackets. + * + */ +void testRTFOutput(const char *name) +{ + int bcount=0; + int line=1; + int c; + QFile f(name); + if (f.open(IO_ReadOnly)) + { + while ((c=f.getch())!=-1) + { + if (c=='\\') // escape char + { + c=f.getch(); + if (c==-1) break; + } + else if (c=='{') // open bracket + { + bcount++; + } + else if (c=='}') // close bracket + { + bcount--; + if (bcount<0) + { + goto err; + break; + } + } + else if (c=='\n') // newline + { + line++; + } + } + } + if (bcount==0) return; // file is OK. +err: + err("error: RTF integrity test failed at line %d of %s due to a bracket mismatch.\n",line,name); + err(" Please try to create a small code example that produces this error \n" + " and send that to dimitri@stack.nl.\n"); +} + +/** + * This is an API to a VERY brittle RTF preprocessor that combines nested + * RTF files. This version replaces the infile with the new file + */ +bool RTFGenerator::preProcessFileInplace(const char *path,const char *name) +{ + QDir d(path); + // store the original directory + if (!d.exists()) + { + err("error: Output dir %s does not exist!\n",path); + return FALSE; + } + QCString oldDir = convertToQCString(QDir::currentDirPath()); + + // go to the html output directory (i.e. path) + QDir::setCurrent(d.absPath()); + QDir thisDir; + + QCString combinedName = (QCString)path+"/combined.rtf"; + QCString mainRTFName = (QCString)path+"/"+name; + + QFile outf(combinedName); + if (!outf.open(IO_WriteOnly)) + { + err("Failed to open %s for writing!\n",combinedName.data()); + return FALSE; + } + FTextStream outt(&outf); + + if (!preProcessFile(thisDir,mainRTFName,outt)) + { + // it failed, remove the temp file + outf.close(); + thisDir.remove(combinedName); + QDir::setCurrent(oldDir); + return FALSE; + } + + // everything worked, move the files + outf.close(); + thisDir.remove(mainRTFName); + thisDir.rename(combinedName,mainRTFName); + + testRTFOutput(mainRTFName); + + QDir::setCurrent(oldDir); + return TRUE; +} + +void RTFGenerator::startMemberGroupHeader(bool hasHeader) +{ + DBG_RTF(t << "{\\comment startMemberGroupHeader}" << endl) + t << "{" << endl; + if (hasHeader) incrementIndentLevel(); + t << rtf_Style_Reset << rtf_Style["GroupHeader"]->reference; +} + +void RTFGenerator::endMemberGroupHeader() +{ + DBG_RTF(t << "{\\comment endMemberGroupHeader}" << endl) + newParagraph(); + t << rtf_Style_Reset << rtf_CList_DepthStyle(); +} + +void RTFGenerator::startMemberGroupDocs() +{ + DBG_RTF(t << "{\\comment startMemberGroupDocs}" << endl) + startEmphasis(); +} + +void RTFGenerator::endMemberGroupDocs() +{ + DBG_RTF(t << "{\\comment endMemberGroupDocs}" << endl) + endEmphasis(); + newParagraph(); +} + +void RTFGenerator::startMemberGroup() +{ + DBG_RTF(t << "{\\comment startMemberGroup}" << endl) + t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl; +} + +void RTFGenerator::endMemberGroup(bool hasHeader) +{ + DBG_RTF(t << "{\\comment endMemberGroup}" << endl) + if (hasHeader) decrementIndentLevel(); + t << "}"; +} + +void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anchor,const char *title) +{ + DBG_RTF(t << "{\\comment (startSimpleSect)}" << endl) + t << "{"; // ends at endDescList + t << "{"; // ends at endDescTitle + startBold(); + newParagraph(); + if (file) + { + writeObjectLink(0,file,anchor,title); + } + else + { + docify(title); + } + endBold(); + t << "}"; + newParagraph(); + incrementIndentLevel(); + t << rtf_Style_Reset << rtf_DList_DepthStyle(); +} + +void RTFGenerator::endSimpleSect() +{ + DBG_RTF(t << "{\\comment (endSimpleSect)}" << endl) + newParagraph(); + decrementIndentLevel(); + m_omitParagraph = TRUE; + t << "}"; +} + +void RTFGenerator::startParamList(ParamListTypes,const char *title) +{ + DBG_RTF(t << "{\\comment (startParamList)}" << endl) + t << "{"; // ends at endParamList + t << "{"; // ends at endDescTitle + startBold(); + newParagraph(); + docify(title); + endBold(); + t << "}"; + newParagraph(); + incrementIndentLevel(); + t << rtf_Style_Reset << rtf_DList_DepthStyle(); +} + +void RTFGenerator::endParamList() +{ + DBG_RTF(t << "{\\comment (endParamList)}" << endl) + newParagraph(); + decrementIndentLevel(); + m_omitParagraph = TRUE; + t << "}"; +} + +void RTFGenerator::startParameterType(bool first,const char *key) +{ + DBG_RTF(t << "{\\comment (startParameterType)}" << endl) + if (!first && key) + { + t << " " << key << " "; + } +} + +void RTFGenerator::endParameterType() +{ + DBG_RTF(t << "{\\comment (endParameterType)}" << endl) + t << " "; +} + +void RTFGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *) +{ + RTFDocVisitor *visitor = new RTFDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString("")); + n->accept(visitor); + delete visitor; + m_omitParagraph = TRUE; +} + +void RTFGenerator::rtfwriteRuler_doubleline() +{ + DBG_RTF(t << "{\\comment (rtfwriteRuler_doubleline)}" << endl) + t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl; +} + +void RTFGenerator::rtfwriteRuler_emboss() +{ + DBG_RTF(t << "{\\comment (rtfwriteRuler_emboss)}" << endl) + t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}" << endl; +} + +void RTFGenerator::rtfwriteRuler_thick() +{ + DBG_RTF(t << "{\\comment (rtfwriteRuler_thick)}" << endl) + t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}" << endl; +} + +void RTFGenerator::rtfwriteRuler_thin() +{ + DBG_RTF(t << "{\\comment (rtfwriteRuler_thin)}" << endl) + t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl; +} + +#if 0 +void RTFGenerator::postProcess(QByteArray &a) +{ + QByteArray enc(a.size()*4); // worst case + int off=0; + uint i; + bool mbFlag=FALSE; + for (i=0;i<a.size();i++) + { + unsigned char c = (unsigned char)a.at(i); + + // treat characters > 0x80 as multibyte characters, except when they + // are control characters + if (c>0x80 || (mbFlag && c!='\\' && c!='{' && c!='}')) + { + char s[10]; + sprintf(s,"\\'%X",c); + qstrcpy(enc.data()+off,s); + off+=qstrlen(s); + mbFlag=c>0x80; + } + else + { + enc.at(off++)=c; + } + } + enc.resize(off); + a = enc; +} +#endif + +void RTFGenerator::startConstraintList(const char *header) +{ + DBG_RTF(t << "{\\comment (startConstraintList)}" << endl) + t << "{"; // ends at endConstraintList + t << "{"; + startBold(); + newParagraph(); + docify(header); + endBold(); + t << "}"; + newParagraph(); + incrementIndentLevel(); + t << rtf_Style_Reset << rtf_DList_DepthStyle(); +} + +void RTFGenerator::startConstraintParam() +{ + DBG_RTF(t << "{\\comment (startConstraintParam)}" << endl) + startEmphasis(); +} + +void RTFGenerator::endConstraintParam() +{ + DBG_RTF(t << "{\\comment (endConstraintParam)}" << endl) + endEmphasis(); + t << " : "; +} + +void RTFGenerator::startConstraintType() +{ + DBG_RTF(t << "{\\comment (startConstraintType)}" << endl) + startEmphasis(); +} + +void RTFGenerator::endConstraintType() +{ + DBG_RTF(t << "{\\comment (endConstraintType)}" << endl) + endEmphasis(); + t << " "; +} + +void RTFGenerator::startConstraintDocs() +{ + DBG_RTF(t << "{\\comment (startConstraintDocs)}" << endl) +} + +void RTFGenerator::endConstraintDocs() +{ + DBG_RTF(t << "{\\comment (endConstraintDocs)}" << endl) + newParagraph(); +} + +void RTFGenerator::endConstraintList() +{ + DBG_RTF(t << "{\\comment (endConstraintList)}" << endl) + newParagraph(); + decrementIndentLevel(); + m_omitParagraph = TRUE; + t << "}"; +} + +void RTFGenerator::startIndexListItem() +{ + DBG_RTF(t << "{\\comment (startIndexListItem)}" << endl) +} + +void RTFGenerator::endIndexListItem() +{ + DBG_RTF(t << "{\\comment (endIndexListItem)}" << endl) + t << "\\par" << endl; +} + +void RTFGenerator::startInlineHeader() +{ + DBG_RTF(t << "{\\comment (startInlineHeader)}" << endl) + t << "{" << endl; + t << rtf_Style_Reset << rtf_Style["Heading5"]->reference; + startBold(); +} + +void RTFGenerator::endInlineHeader() +{ + DBG_RTF(t << "{\\comment (endInlineHeader)}" << endl) + endBold(); + t << "\\par"; + t << "}" << endl; +} + +void RTFGenerator::startMemberDocSimple() +{ + DBG_RTF(t << "{\\comment (startMemberDocSimple)}" << endl) + t << "{\\par" << endl; + t << "{" << rtf_Style["Heading5"]->reference << endl; + t << theTranslator->trCompoundMembers() << ":\\par}" << endl; + t << rtf_Style_Reset << rtf_DList_DepthStyle(); + t << "\\trowd \\trgaph108\\trleft426\\tblind426" + "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<< endl; + int i,columnPos[3] = { 25, 50, 100 }; + for (i=0;i<3;i++) + { + t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 " + "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 " + "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 " + "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 " + "\\cltxlrtb " + "\\cellx" << (rtf_pageWidth*columnPos[i]/100) << endl; + } + t << "\\pard \\widctlpar\\intbl\\adjustright" << endl; +} + +void RTFGenerator::endMemberDocSimple() +{ + DBG_RTF(t << "{\\comment (endMemberDocSimple)}" << endl) + t << "}" << endl; +} + +void RTFGenerator::startInlineMemberType() +{ + DBG_RTF(t << "{\\comment (startInlineMemberType)}" << endl) + t << "{\\qr "; +} + +void RTFGenerator::endInlineMemberType() +{ + DBG_RTF(t << "{\\comment (endInlineMemberType)}" << endl) + t << "\\cell }"; +} + +void RTFGenerator::startInlineMemberName() +{ + DBG_RTF(t << "{\\comment (startInlineMemberName)}" << endl) + t << "{"; +} + +void RTFGenerator::endInlineMemberName() +{ + DBG_RTF(t << "{\\comment (endInlineMemberName)}" << endl) + t << "\\cell }"; +} + +void RTFGenerator::startInlineMemberDoc() +{ + DBG_RTF(t << "{\\comment (startInlineMemberDoc)}" << endl) + t << "{"; +} + +void RTFGenerator::endInlineMemberDoc() +{ + DBG_RTF(t << "{\\comment (endInlineMemberDoc)}" << endl) + t << "\\cell }{\\row }" << endl; +} + +void RTFGenerator::startLabels() +{ +} + +void RTFGenerator::writeLabel(const char *l,bool isLast) +{ + t << "{\\f2 [" << l << "]}"; + if (!isLast) t << ", "; +} + +void RTFGenerator::endLabels() +{ +} + + + |