Blame src/rtfgen.cpp

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