Blame src/htmlgen.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
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 "message.h"
Packit 1c1d7e
#include "htmlgen.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "logos.h"
Packit 1c1d7e
#include "diagram.h"
Packit 1c1d7e
#include "version.h"
Packit 1c1d7e
#include "dot.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "htmlhelp.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "htmldocvisitor.h"
Packit 1c1d7e
#include "searchindex.h"
Packit 1c1d7e
#include "pagedef.h"
Packit 1c1d7e
#include "debug.h"
Packit 1c1d7e
#include "dirdef.h"
Packit 1c1d7e
#include "vhdldocgen.h"
Packit 1c1d7e
#include "layout.h"
Packit 1c1d7e
#include "image.h"
Packit 1c1d7e
#include "ftvhelp.h"
Packit 1c1d7e
#include "bufstr.h"
Packit 1c1d7e
#include "resourcemgr.h"
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
//#define DBG_HTML(x) x;
Packit 1c1d7e
#define DBG_HTML(x)
Packit 1c1d7e
Packit 1c1d7e
static QCString g_header;
Packit 1c1d7e
static QCString g_footer;
Packit 1c1d7e
static QCString g_mathjax_code;
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
// note: this is only active if DISABLE_INDEX=YES, if DISABLE_INDEX is disabled, this
Packit 1c1d7e
// part will be rendered inside menu.js
Packit 1c1d7e
static void writeClientSearchBox(FTextStream &t,const char *relPath)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "        
\n";
Packit 1c1d7e
  t << "        \n";
Packit 1c1d7e
  t << "          
Packit 1c1d7e
  t << "               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
Packit 1c1d7e
  t << "               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
Packit 1c1d7e
  t << "               alt=\"\"/>\n";
Packit 1c1d7e
  t << "          
Packit 1c1d7e
    << theTranslator->trSearch() << "\" accesskey=\"S\"\n";
Packit 1c1d7e
  t << "               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
Packit 1c1d7e
  t << "               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
Packit 1c1d7e
  t << "               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
Packit 1c1d7e
  t << "          \n";
Packit 1c1d7e
  t << "            "
Packit 1c1d7e
    << "\"\"/\n";
Packit 1c1d7e
  t << "          \n";
Packit 1c1d7e
  t << "        \n";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// note: this is only active if DISABLE_INDEX=YES. if DISABLE_INDEX is disabled, this
Packit 1c1d7e
// part will be rendered inside menu.js
Packit 1c1d7e
static void writeServerSearchBox(FTextStream &t,const char *relPath,bool highlightSearch)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
Packit 1c1d7e
  t << "        
\n";
Packit 1c1d7e
  t << "          
\n";
Packit 1c1d7e
  t << "            
Packit 1c1d7e
  if (externalSearch)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "search" << Doxygen::htmlFileExtension;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "search.php";
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "\" method=\"get\">\n";
Packit 1c1d7e
  t << "              \"\"/\n";
Packit 1c1d7e
  if (!highlightSearch)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "              
Packit 1c1d7e
      << theTranslator->trSearch() << "\" size=\"20\" accesskey=\"S\" \n";
Packit 1c1d7e
    t << "                     onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
Packit 1c1d7e
    t << "                     onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
Packit 1c1d7e
    t << "            </form>\n";
Packit 1c1d7e
    t << "          
\n";
Packit 1c1d7e
    t << "        \n";
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
/// Clear a text block \a s from \a begin to \a end markers
Packit 1c1d7e
QCString clearBlock(const char *s,const char *begin,const char *end)
Packit 1c1d7e
{
Packit 1c1d7e
  if (s==0 || begin==0 || end==0) return s;
Packit 1c1d7e
  const char *p, *q;
Packit 1c1d7e
  int beginLen = qstrlen(begin);
Packit 1c1d7e
  int endLen = qstrlen(end);
Packit 1c1d7e
  int resLen = 0;
Packit 1c1d7e
  for (p=s; (q=strstr(p,begin))!=0; p=q+endLen)
Packit 1c1d7e
  {
Packit 1c1d7e
    resLen+=(int)(q-p);
Packit 1c1d7e
    p=q+beginLen;
Packit 1c1d7e
    if ((q=strstr(p,end))==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      resLen+=beginLen;
Packit 1c1d7e
      break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  resLen+=qstrlen(p);
Packit 1c1d7e
  // resLen is the length of the string without the marked block
Packit 1c1d7e
Packit 1c1d7e
  QCString result(resLen+1);
Packit 1c1d7e
  char *r;
Packit 1c1d7e
  for (r=result.rawData(), p=s; (q=strstr(p,begin))!=0; p=q+endLen)
Packit 1c1d7e
  {
Packit 1c1d7e
    int l = (int)(q-p);
Packit 1c1d7e
    memcpy(r,p,l);
Packit 1c1d7e
    r+=l;
Packit 1c1d7e
    p=q+beginLen;
Packit 1c1d7e
    if ((q=strstr(p,end))==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      memcpy(r,begin,beginLen);
Packit 1c1d7e
      r+=beginLen;
Packit 1c1d7e
      break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  qstrcpy(r,p);
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
//----------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
QCString selectBlock(const QCString& s,const QCString &name,bool enable)
Packit 1c1d7e
{
Packit 1c1d7e
  // TODO: this is an expensive function that is called a lot -> optimize it
Packit 1c1d7e
  const QCString begin = "";
Packit 1c1d7e
  const QCString end = "";
Packit 1c1d7e
  const QCString nobegin = "";
Packit 1c1d7e
  const QCString noend = "";
Packit 1c1d7e
Packit 1c1d7e
  QCString result = s;
Packit 1c1d7e
  if (enable)
Packit 1c1d7e
  {
Packit 1c1d7e
    result = substitute(result, begin, "");
Packit 1c1d7e
    result = substitute(result, end, "");
Packit 1c1d7e
    result = clearBlock(result, nobegin, noend);
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    result = substitute(result, nobegin, "");
Packit 1c1d7e
    result = substitute(result, noend, "");
Packit 1c1d7e
    result = clearBlock(result, begin, end);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString getSearchBox(bool serverSide, QCString relPath, bool highlightSearch)
Packit 1c1d7e
{
Packit 1c1d7e
  QGString result;
Packit 1c1d7e
  FTextStream t(&result);
Packit 1c1d7e
  if (serverSide)
Packit 1c1d7e
  {
Packit 1c1d7e
    writeServerSearchBox(t, relPath, highlightSearch);
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    writeClientSearchBox(t, relPath);
Packit 1c1d7e
  }
Packit 1c1d7e
  return QCString(result);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString removeEmptyLines(const QCString &s)
Packit 1c1d7e
{
Packit 1c1d7e
  BufStr out(s.length()+1);
Packit 1c1d7e
  const char *p=s.data();
Packit 1c1d7e
  if (p)
Packit 1c1d7e
  {
Packit 1c1d7e
    char c;
Packit 1c1d7e
    while ((c=*p++))
Packit 1c1d7e
    {
Packit 1c1d7e
      if (c=='\n')
Packit 1c1d7e
      {
Packit 1c1d7e
        const char *e = p;
Packit 1c1d7e
        while (*e==' ' || *e=='\t') e++;
Packit 1c1d7e
        if (*e=='\n')
Packit 1c1d7e
        {
Packit 1c1d7e
          p=e;
Packit 1c1d7e
        }
Packit 1c1d7e
        else out.addChar(c);
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        out.addChar(c);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  out.addChar('\0');
Packit 1c1d7e
  //printf("removeEmptyLines(%s)=%s\n",s.data(),out.data());
Packit 1c1d7e
  return out.data();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString substituteHtmlKeywords(const QCString &s,
Packit 1c1d7e
                                       const QCString &title,
Packit 1c1d7e
                                       const QCString &relPath,
Packit 1c1d7e
                                       const QCString &navPath=QCString())
Packit 1c1d7e
{
Packit 1c1d7e
  // Build CSS/Javascript tags depending on treeview, search engine settings
Packit 1c1d7e
  QCString cssFile;
Packit 1c1d7e
  QStrList extraCssFile;
Packit 1c1d7e
  QCString generatedBy;
Packit 1c1d7e
  QCString treeViewCssJs;
Packit 1c1d7e
  QCString searchCssJs;
Packit 1c1d7e
  QCString searchBox;
Packit 1c1d7e
  QCString mathJaxJs;
Packit 1c1d7e
  QCString extraCssText;
Packit 1c1d7e
Packit 1c1d7e
  static QCString projectName = Config_getString(PROJECT_NAME);
Packit 1c1d7e
  static bool timeStamp = Config_getBool(HTML_TIMESTAMP);
Packit 1c1d7e
  static bool treeView = Config_getBool(GENERATE_TREEVIEW);
Packit 1c1d7e
  static bool searchEngine = Config_getBool(SEARCHENGINE);
Packit 1c1d7e
  static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
Packit 1c1d7e
  static bool mathJax = Config_getBool(USE_MATHJAX);
Packit 1c1d7e
  static QCString mathJaxFormat = Config_getEnum(MATHJAX_FORMAT);
Packit 1c1d7e
  static bool disableIndex = Config_getBool(DISABLE_INDEX);
Packit 1c1d7e
  static bool hasProjectName = !projectName.isEmpty();
Packit 1c1d7e
  static bool hasProjectNumber = !Config_getString(PROJECT_NUMBER).isEmpty();
Packit 1c1d7e
  static bool hasProjectBrief = !Config_getString(PROJECT_BRIEF).isEmpty();
Packit 1c1d7e
  static bool hasProjectLogo = !Config_getString(PROJECT_LOGO).isEmpty();
Packit 1c1d7e
  static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
Packit 1c1d7e
Packit 1c1d7e
  cssFile = Config_getString(HTML_STYLESHEET);
Packit 1c1d7e
  if (cssFile.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    cssFile = "doxygen.css";
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    QFileInfo cssfi(cssFile);
Packit 1c1d7e
    if (cssfi.exists())
Packit 1c1d7e
    {
Packit 1c1d7e
      cssFile = cssfi.fileName().utf8();
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      cssFile = "doxygen.css";
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  extraCssText = "";
Packit 1c1d7e
  extraCssFile = Config_getList(HTML_EXTRA_STYLESHEET);
Packit 1c1d7e
  for (uint i=0; i
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString fileName(extraCssFile.at(i));
Packit 1c1d7e
    if (!fileName.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      QFileInfo fi(fileName);
Packit 1c1d7e
      if (fi.exists())
Packit 1c1d7e
      {
Packit 1c1d7e
        extraCssText += "<link href=\"$relpath^"+stripPath(fileName)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (timeStamp)
Packit 1c1d7e
  {
Packit 1c1d7e
    generatedBy = theTranslator->trGeneratedAt(dateToString(TRUE), convertToHtml(Config_getString(PROJECT_NAME)));
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    generatedBy = theTranslator->trGeneratedBy();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (treeView)
Packit 1c1d7e
  {
Packit 1c1d7e
    treeViewCssJs = "<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
Packit 1c1d7e
			"<script type=\"text/javascript\" src=\"$relpath^resize.js\"></script>\n"
Packit 1c1d7e
			"<script type=\"text/javascript\" src=\"$relpath^navtreedata.js\"></script>\n"
Packit 1c1d7e
			"<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n"
Packit 1c1d7e
			"<script type=\"text/javascript\">\n"
Packit 1c1d7e
			"/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n"
Packit 1c1d7e
			"  $(document).ready(initResizable);\n"
Packit 1c1d7e
			"/* @license-end */"
Packit 1c1d7e
			"</script>";
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (searchEngine)
Packit 1c1d7e
  {
Packit 1c1d7e
    searchCssJs = "<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
Packit 1c1d7e
    if (!serverBasedSearch)
Packit 1c1d7e
    {
Packit 1c1d7e
      searchCssJs += "<script type=\"text/javascript\" src=\"$relpath^search/searchdata.js\"></script>\n";
Packit 1c1d7e
    }
Packit 1c1d7e
    searchCssJs += "<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
Packit 1c1d7e
Packit 1c1d7e
    if (!serverBasedSearch)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (disableIndex || !Config_getBool(HTML_DYNAMIC_MENUS))
Packit 1c1d7e
      {
Packit 1c1d7e
        searchCssJs += "<script type=\"text/javascript\">\n"
Packit 1c1d7e
					"/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n"
Packit 1c1d7e
				"  $(document).ready(function() { init_search(); });\n"
Packit 1c1d7e
					"/* @license-end */\n"
Packit 1c1d7e
					"</script>";
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      if (disableIndex || !Config_getBool(HTML_DYNAMIC_MENUS))
Packit 1c1d7e
      {
Packit 1c1d7e
        searchCssJs += "<script type=\"text/javascript\">\n"
Packit 1c1d7e
					"/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n"
Packit 1c1d7e
					"  $(document).ready(function() {\n"
Packit 1c1d7e
					"    if ($('.searchresults').length > 0) { searchBox.DOMSearchField().focus(); }\n"
Packit 1c1d7e
					"  });\n"
Packit 1c1d7e
					"  /* @license-end */\n"
Packit 1c1d7e
					"</script>\n";
Packit 1c1d7e
      }
Packit 1c1d7e
Packit 1c1d7e
      // OPENSEARCH_PROVIDER {
Packit 1c1d7e
      searchCssJs += "
Packit 1c1d7e
                     "search_opensearch.php?v=opensearch.xml\" "
Packit 1c1d7e
                     "type=\"application/opensearchdescription+xml\" title=\"" +
Packit 1c1d7e
                     (hasProjectName ? projectName : QCString("Doxygen")) +
Packit 1c1d7e
                     "\"/>";
Packit 1c1d7e
      // OPENSEARCH_PROVIDER }
Packit 1c1d7e
    }
Packit 1c1d7e
    searchBox = getSearchBox(serverBasedSearch, relPath, FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (mathJax)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString path = Config_getString(MATHJAX_RELPATH);
Packit 1c1d7e
    if (path.isEmpty() || path.left(2)=="..") // relative path
Packit 1c1d7e
    {
Packit 1c1d7e
      path.prepend(relPath);
Packit 1c1d7e
    }
Packit 1c1d7e
    mathJaxJs = "<script type=\"text/x-mathjax-config\">\n"
Packit 1c1d7e
                "  MathJax.Hub.Config({\n"
Packit 1c1d7e
                "    extensions: [\"tex2jax.js\"";
Packit 1c1d7e
    QStrList &mathJaxExtensions = Config_getList(MATHJAX_EXTENSIONS);
Packit 1c1d7e
    const char *s = mathJaxExtensions.first();
Packit 1c1d7e
    while (s)
Packit 1c1d7e
    {
Packit 1c1d7e
      mathJaxJs+= ", \""+QCString(s)+".js\"";
Packit 1c1d7e
      s = mathJaxExtensions.next();
Packit 1c1d7e
    }
Packit 1c1d7e
    if (mathJaxFormat.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      mathJaxFormat = "HTML-CSS";
Packit 1c1d7e
    }
Packit 1c1d7e
    mathJaxJs += "],\n"
Packit 1c1d7e
                 "    jax: [\"input/TeX\",\"output/"+mathJaxFormat+"\"],\n"
Packit 1c1d7e
                 "});\n";
Packit 1c1d7e
    if (!g_mathjax_code.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      mathJaxJs += g_mathjax_code;
Packit 1c1d7e
      mathJaxJs += "\n";
Packit 1c1d7e
    }
Packit 1c1d7e
    mathJaxJs += "</script>";
Packit 1c1d7e
    mathJaxJs += "<script type=\"text/javascript\" async src=\"" + path + "MathJax.js\"></script>\n";
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // first substitute generic keywords
Packit 1c1d7e
  QCString result = substituteKeywords(s,title,
Packit 1c1d7e
        convertToHtml(Config_getString(PROJECT_NAME)),
Packit 1c1d7e
        convertToHtml(Config_getString(PROJECT_NUMBER)),
Packit 1c1d7e
        convertToHtml(Config_getString(PROJECT_BRIEF)));
Packit 1c1d7e
Packit 1c1d7e
  // additional HTML only keywords
Packit 1c1d7e
  result = substitute(result,"$navpath",navPath);
Packit 1c1d7e
  result = substitute(result,"$stylesheet",cssFile);
Packit 1c1d7e
  result = substitute(result,"$treeview",treeViewCssJs);
Packit 1c1d7e
  result = substitute(result,"$searchbox",searchBox);
Packit 1c1d7e
  result = substitute(result,"$search",searchCssJs);
Packit 1c1d7e
  result = substitute(result,"$mathjax",mathJaxJs);
Packit 1c1d7e
  result = substitute(result,"$generatedby",generatedBy);
Packit 1c1d7e
  result = substitute(result,"$extrastylesheet",extraCssText);
Packit 1c1d7e
  result = substitute(result,"$relpath$",relPath); //<-- obsolete: for backwards compatibility only
Packit 1c1d7e
  result = substitute(result,"$relpath^",relPath); //<-- must be last
Packit 1c1d7e
Packit 1c1d7e
  // additional HTML only conditional blocks
Packit 1c1d7e
  result = selectBlock(result,"DISABLE_INDEX",disableIndex);
Packit 1c1d7e
  result = selectBlock(result,"GENERATE_TREEVIEW",treeView);
Packit 1c1d7e
  result = selectBlock(result,"SEARCHENGINE",searchEngine);
Packit 1c1d7e
  result = selectBlock(result,"TITLEAREA",titleArea);
Packit 1c1d7e
  result = selectBlock(result,"PROJECT_NAME",hasProjectName);
Packit 1c1d7e
  result = selectBlock(result,"PROJECT_NUMBER",hasProjectNumber);
Packit 1c1d7e
  result = selectBlock(result,"PROJECT_BRIEF",hasProjectBrief);
Packit 1c1d7e
  result = selectBlock(result,"PROJECT_LOGO",hasProjectLogo);
Packit 1c1d7e
Packit 1c1d7e
  result = removeEmptyLines(result);
Packit 1c1d7e
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
HtmlCodeGenerator::HtmlCodeGenerator()
Packit 1c1d7e
   : m_streamSet(FALSE), m_col(0)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
HtmlCodeGenerator::HtmlCodeGenerator(FTextStream &t,const QCString &relPath)
Packit 1c1d7e
   : m_col(0), m_relPath(relPath)
Packit 1c1d7e
{
Packit 1c1d7e
  setTextStream(t);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::setTextStream(FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  m_streamSet = t.device()!=0;
Packit 1c1d7e
  m_t.setDevice(t.device());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::setRelativePath(const QCString &path)
Packit 1c1d7e
{
Packit 1c1d7e
  m_relPath = path;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::codify(const char *str)
Packit 1c1d7e
{
Packit 1c1d7e
  static int tabSize = Config_getInt(TAB_SIZE);
Packit 1c1d7e
  if (str && m_streamSet)
Packit 1c1d7e
  {
Packit 1c1d7e
    const char *p=str;
Packit 1c1d7e
    char c;
Packit 1c1d7e
    int spacesToNextTabStop;
Packit 1c1d7e
    while (*p)
Packit 1c1d7e
    {
Packit 1c1d7e
      c=*p++;
Packit 1c1d7e
      switch(c)
Packit 1c1d7e
      {
Packit 1c1d7e
        case '\t': spacesToNextTabStop =
Packit 1c1d7e
                         tabSize - (m_col%tabSize);
Packit 1c1d7e
                   m_t << Doxygen::spaces.left(spacesToNextTabStop);
Packit 1c1d7e
                   m_col+=spacesToNextTabStop;
Packit 1c1d7e
                   break;
Packit 1c1d7e
        case '\n': m_t << "\n"; m_col=0;
Packit 1c1d7e
                   break;
Packit 1c1d7e
        case '\r': break;
Packit 1c1d7e
        case '<':  m_t << "<"; m_col++;
Packit 1c1d7e
                   break;
Packit 1c1d7e
        case '>':  m_t << ">"; m_col++;
Packit 1c1d7e
                   break;
Packit 1c1d7e
        case '&':  m_t << "&"; m_col++;
Packit 1c1d7e
                   break;
Packit 1c1d7e
        case '\'': m_t << "'"; m_col++; // ' is not valid XHTML
Packit 1c1d7e
                   break;
Packit 1c1d7e
        case '"':  m_t << """; m_col++;
Packit 1c1d7e
                   break;
Packit 1c1d7e
        case '\\':
Packit 1c1d7e
                   if (*p=='<')
Packit 1c1d7e
                     { m_t << "<"; p++; }
Packit 1c1d7e
                   else if (*p=='>')
Packit 1c1d7e
                     { m_t << ">"; p++; }
Packit 1c1d7e
                   else
Packit 1c1d7e
                     m_t << "\\";
Packit 1c1d7e
                   m_col++;
Packit 1c1d7e
                   break;
Packit 1c1d7e
        default:   p=writeUtf8Char(m_t,p-1);
Packit 1c1d7e
                   m_col++;
Packit 1c1d7e
                   break;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::docify(const char *str)
Packit 1c1d7e
{
Packit 1c1d7e
  if (str && m_streamSet)
Packit 1c1d7e
  {
Packit 1c1d7e
    const char *p=str;
Packit 1c1d7e
    char c;
Packit 1c1d7e
    while (*p)
Packit 1c1d7e
    {
Packit 1c1d7e
      c=*p++;
Packit 1c1d7e
      switch(c)
Packit 1c1d7e
      {
Packit 1c1d7e
        case '<':  m_t << "<"; break;
Packit 1c1d7e
        case '>':  m_t << ">"; break;
Packit 1c1d7e
        case '&':  m_t << "&"; break;
Packit 1c1d7e
        case '"':  m_t << """; break;
Packit 1c1d7e
        case '\\':
Packit 1c1d7e
                   if (*p=='<')
Packit 1c1d7e
                     { m_t << "<"; p++; }
Packit 1c1d7e
                   else if (*p=='>')
Packit 1c1d7e
                     { m_t << ">"; p++; }
Packit 1c1d7e
                   else
Packit 1c1d7e
                     m_t << "\\";
Packit 1c1d7e
                   break;
Packit 1c1d7e
        default:   m_t << c;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::writeLineNumber(const char *ref,const char *filename,
Packit 1c1d7e
                                    const char *anchor,int l)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!m_streamSet) return;
Packit 1c1d7e
  const int maxLineNrStr = 10;
Packit 1c1d7e
  char lineNumber[maxLineNrStr];
Packit 1c1d7e
  char lineAnchor[maxLineNrStr];
Packit 1c1d7e
  qsnprintf(lineNumber,maxLineNrStr,"%5d",l);
Packit 1c1d7e
  qsnprintf(lineAnchor,maxLineNrStr,"l%05d",l);
Packit 1c1d7e
Packit 1c1d7e
  m_t << "
";
Packit 1c1d7e
  m_t << "";
Packit 1c1d7e
  if (filename)
Packit 1c1d7e
  {
Packit 1c1d7e
    _writeCodeLink("line",ref,filename,anchor,lineNumber,0);
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    codify(lineNumber);
Packit 1c1d7e
  }
Packit 1c1d7e
  m_t << "";
Packit 1c1d7e
  m_t << " ";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::writeCodeLink(const char *ref,const char *f,
Packit 1c1d7e
                                      const char *anchor, const char *name,
Packit 1c1d7e
                                      const char *tooltip)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!m_streamSet) return;
Packit 1c1d7e
  //printf("writeCodeLink(ref=%s,f=%s,anchor=%s,name=%s,tooltip=%s)\n",ref,f,anchor,name,tooltip);
Packit 1c1d7e
  _writeCodeLink("code",ref,f,anchor,name,tooltip);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::_writeCodeLink(const char *className,
Packit 1c1d7e
                                      const char *ref,const char *f,
Packit 1c1d7e
                                      const char *anchor, const char *name,
Packit 1c1d7e
                                      const char *tooltip)
Packit 1c1d7e
{
Packit 1c1d7e
  if (ref)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
Packit 1c1d7e
    m_t << externalLinkTarget() << externalRef(m_relPath,ref,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
Packit 1c1d7e
  }
Packit 1c1d7e
  m_t << "href=\"";
Packit 1c1d7e
  m_t << externalRef(m_relPath,ref,TRUE);
Packit 1c1d7e
  if (f) m_t << f << Doxygen::htmlFileExtension;
Packit 1c1d7e
  if (anchor) m_t << "#" << anchor;
Packit 1c1d7e
  m_t << "\"";
Packit 1c1d7e
  if (tooltip) m_t << " title=\"" << convertToHtml(tooltip) << "\"";
Packit 1c1d7e
  m_t << ">";
Packit 1c1d7e
  docify(name);
Packit 1c1d7e
  m_t << "";
Packit 1c1d7e
  m_col+=qstrlen(name);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::writeTooltip(const char *id, const DocLinkInfo &docInfo,
Packit 1c1d7e
                                     const char *decl, const char *desc,
Packit 1c1d7e
                                     const SourceLinkInfo &defInfo,
Packit 1c1d7e
                                     const SourceLinkInfo &declInfo)
Packit 1c1d7e
{
Packit 1c1d7e
  m_t << "
";
Packit 1c1d7e
  m_t << "
";
Packit 1c1d7e
  if (!docInfo.url.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
Packit 1c1d7e
    m_t << externalRef(m_relPath,docInfo.ref,TRUE);
Packit 1c1d7e
    m_t << docInfo.url << Doxygen::htmlFileExtension;
Packit 1c1d7e
    if (!docInfo.anchor.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      m_t << "#" << docInfo.anchor;
Packit 1c1d7e
    }
Packit 1c1d7e
    m_t << "\">";
Packit 1c1d7e
  }
Packit 1c1d7e
  docify(docInfo.name);
Packit 1c1d7e
  if (!docInfo.url.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  m_t << "";
Packit 1c1d7e
  if (decl)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
";
Packit 1c1d7e
    docify(decl);
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  if (desc)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
";
Packit 1c1d7e
    docify(desc); // desc is already HTML escaped; but there are still < and > signs
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!defInfo.file.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
Definition: ";
Packit 1c1d7e
    if (!defInfo.url.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      m_t << "
Packit 1c1d7e
      m_t << externalRef(m_relPath,defInfo.ref,TRUE);
Packit 1c1d7e
      m_t << defInfo.url << Doxygen::htmlFileExtension;
Packit 1c1d7e
      if (!defInfo.anchor.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "#" << defInfo.anchor;
Packit 1c1d7e
      }
Packit 1c1d7e
      m_t << "\">";
Packit 1c1d7e
    }
Packit 1c1d7e
    m_t << defInfo.file << ":" << defInfo.line;
Packit 1c1d7e
    if (!defInfo.url.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      m_t << "";
Packit 1c1d7e
    }
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!declInfo.file.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
Declaration: ";
Packit 1c1d7e
    if (!declInfo.url.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      m_t << "
Packit 1c1d7e
      m_t << externalRef(m_relPath,declInfo.ref,TRUE);
Packit 1c1d7e
      m_t << declInfo.url << Doxygen::htmlFileExtension;
Packit 1c1d7e
      if (!declInfo.anchor.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "#" << declInfo.anchor;
Packit 1c1d7e
      }
Packit 1c1d7e
      m_t << "\">";
Packit 1c1d7e
    }
Packit 1c1d7e
    m_t << declInfo.file << ":" << declInfo.line;
Packit 1c1d7e
    if (!declInfo.url.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      m_t << "";
Packit 1c1d7e
    }
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  m_t << "" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::startCodeLine(bool hasLineNumbers)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_streamSet)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!hasLineNumbers) m_t << "
";
Packit 1c1d7e
    m_col=0;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::endCodeLine()
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_streamSet) m_t << "";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::startFontClass(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_streamSet) m_t << "";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::endFontClass()
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_streamSet) m_t << "";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlCodeGenerator::writeCodeAnchor(const char *anchor)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_streamSet) m_t << "";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
HtmlGenerator::HtmlGenerator() : OutputGenerator()
Packit 1c1d7e
{
Packit 1c1d7e
  dir=Config_getString(HTML_OUTPUT);
Packit 1c1d7e
  m_emptySection=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
HtmlGenerator::~HtmlGenerator()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("HtmlGenerator::~HtmlGenerator()\n");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::init()
Packit 1c1d7e
{
Packit 1c1d7e
  QCString dname=Config_getString(HTML_OUTPUT);
Packit 1c1d7e
  QDir d(dname);
Packit 1c1d7e
  if (!d.exists() && !d.mkdir(dname))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Could not create output directory %s\n",dname.data());
Packit 1c1d7e
    exit(1);
Packit 1c1d7e
  }
Packit 1c1d7e
  //writeLogo(dname);
Packit 1c1d7e
  if (!Config_getString(HTML_HEADER).isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    g_header=fileToString(Config_getString(HTML_HEADER));
Packit 1c1d7e
    //printf("g_header='%s'\n",g_header.data());
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    g_header = ResourceMgr::instance().getAsString("header.html");
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (!Config_getString(HTML_FOOTER).isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    g_footer=fileToString(Config_getString(HTML_FOOTER));
Packit 1c1d7e
    //printf("g_footer='%s'\n",g_footer.data());
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    g_footer = ResourceMgr::instance().getAsString("footer.html");
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (Config_getBool(USE_MATHJAX))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!Config_getString(MATHJAX_CODEFILE).isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      g_mathjax_code=fileToString(Config_getString(MATHJAX_CODEFILE));
Packit 1c1d7e
      //printf("g_mathjax_code='%s'\n",g_mathjax_code.data());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  createSubDirs(d);
Packit 1c1d7e
Packit 1c1d7e
  ResourceMgr &mgr = ResourceMgr::instance();
Packit 1c1d7e
  if (Config_getBool(HTML_DYNAMIC_MENUS))
Packit 1c1d7e
  {
Packit 1c1d7e
    mgr.copyResourceAs("tabs.css",dname,"tabs.css");
Packit 1c1d7e
  }
Packit 1c1d7e
  else // stylesheet for the 'old' static tabs
Packit 1c1d7e
  {
Packit 1c1d7e
    mgr.copyResourceAs("fixed_tabs.css",dname,"tabs.css");
Packit 1c1d7e
  }
Packit 1c1d7e
  mgr.copyResource("jquery.js",dname);
Packit 1c1d7e
  if (Config_getBool(INTERACTIVE_SVG))
Packit 1c1d7e
  {
Packit 1c1d7e
    mgr.copyResource("svgpan.js",dname);
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!Config_getBool(DISABLE_INDEX) && Config_getBool(HTML_DYNAMIC_MENUS))
Packit 1c1d7e
  {
Packit 1c1d7e
    mgr.copyResource("menu.js",dname);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  {
Packit 1c1d7e
    QFile f(dname+"/dynsections.js");
Packit 1c1d7e
    if (f.open(IO_WriteOnly))
Packit 1c1d7e
    {
Packit 1c1d7e
      FTextStream t(&f);
Packit 1c1d7e
      t << mgr.getAsString("dynsections.js");
Packit 1c1d7e
      if (Config_getBool(SOURCE_BROWSER) && Config_getBool(SOURCE_TOOLTIPS))
Packit 1c1d7e
      {
Packit 1c1d7e
        t << endl <<
Packit 1c1d7e
          "$(document).ready(function() {\n"
Packit 1c1d7e
          "  $('.code,.codeRef').each(function() {\n"
Packit 1c1d7e
          "    $(this).data('powertip',$('#'+$(this).attr('href').replace(/.*\\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html());\n"
Packit 1c1d7e
          "    $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true });\n"
Packit 1c1d7e
          "  });\n"
Packit 1c1d7e
          "});\n";
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/// Additional initialization after indices have been created
Packit 1c1d7e
void HtmlGenerator::writeTabData()
Packit 1c1d7e
{
Packit 1c1d7e
  Doxygen::indexList->addStyleSheetFile("tabs.css");
Packit 1c1d7e
  QCString dname=Config_getString(HTML_OUTPUT);
Packit 1c1d7e
  ResourceMgr &mgr = ResourceMgr::instance();
Packit 1c1d7e
  //writeColoredImgData(dname,colored_tab_data);
Packit 1c1d7e
  mgr.copyResource("tab_a.lum",dname);
Packit 1c1d7e
  mgr.copyResource("tab_b.lum",dname);
Packit 1c1d7e
  mgr.copyResource("tab_h.lum",dname);
Packit 1c1d7e
  mgr.copyResource("tab_s.lum",dname);
Packit 1c1d7e
  mgr.copyResource("nav_h.lum",dname);
Packit 1c1d7e
  mgr.copyResource("nav_f.lum",dname);
Packit 1c1d7e
  mgr.copyResource("bc_s.luma",dname);
Packit 1c1d7e
  mgr.copyResource("doxygen.luma",dname);
Packit 1c1d7e
  mgr.copyResource("closed.luma",dname);
Packit 1c1d7e
  mgr.copyResource("open.luma",dname);
Packit 1c1d7e
  mgr.copyResource("bdwn.luma",dname);
Packit 1c1d7e
  mgr.copyResource("sync_on.luma",dname);
Packit 1c1d7e
  mgr.copyResource("sync_off.luma",dname);
Packit 1c1d7e
Packit 1c1d7e
  //{
Packit 1c1d7e
  //  unsigned char shadow[6] = { 5, 5, 5, 5, 5, 5 };
Packit 1c1d7e
  //  unsigned char shadow_alpha[6]  = { 80, 60, 40, 20, 10, 0 };
Packit 1c1d7e
  //  ColoredImage img(1,6,shadow,shadow_alpha,0,0,100);
Packit 1c1d7e
  //  img.save(dname+"/nav_g.png");
Packit 1c1d7e
  //}
Packit 1c1d7e
  mgr.copyResource("nav_g.png",dname);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeSearchData(const char *dir)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
Packit 1c1d7e
  //writeImgData(dir,serverBasedSearch ? search_server_data : search_client_data);
Packit 1c1d7e
  ResourceMgr &mgr = ResourceMgr::instance();
Packit 1c1d7e
Packit 1c1d7e
  mgr.copyResource("search_l.png",dir);
Packit 1c1d7e
  Doxygen::indexList->addImageFile("search/search_l.png");
Packit 1c1d7e
  mgr.copyResource("search_m.png",dir);
Packit 1c1d7e
  Doxygen::indexList->addImageFile("search/search_m.png");
Packit 1c1d7e
  mgr.copyResource("search_r.png",dir);
Packit 1c1d7e
  Doxygen::indexList->addImageFile("search/search_r.png");
Packit 1c1d7e
  if (serverBasedSearch)
Packit 1c1d7e
  {
Packit 1c1d7e
    mgr.copyResource("mag.png",dir);
Packit 1c1d7e
    Doxygen::indexList->addImageFile("search/mag.png");
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    mgr.copyResource("close.png",dir);
Packit 1c1d7e
    Doxygen::indexList->addImageFile("search/close.png");
Packit 1c1d7e
    mgr.copyResource("mag_sel.png",dir);
Packit 1c1d7e
    Doxygen::indexList->addImageFile("search/mag_sel.png");
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
Packit 1c1d7e
  QFile f(searchDirName+"/search.css");
Packit 1c1d7e
  if (f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    FTextStream t(&f);
Packit 1c1d7e
    QCString searchCss;
Packit 1c1d7e
    if (Config_getBool(DISABLE_INDEX))
Packit 1c1d7e
    {
Packit 1c1d7e
      searchCss = mgr.getAsString("search_nomenu.css");
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (!Config_getBool(HTML_DYNAMIC_MENUS))
Packit 1c1d7e
    {
Packit 1c1d7e
      searchCss = mgr.getAsString("search_fixedtabs.css");
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      searchCss = mgr.getAsString("search.css");
Packit 1c1d7e
    }
Packit 1c1d7e
    searchCss = substitute(replaceColorMarkers(searchCss),"$doxygenversion",versionString);
Packit 1c1d7e
    t << searchCss;
Packit 1c1d7e
    Doxygen::indexList->addStyleSheetFile("search/search.css");
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeStyleSheetFile(QFile &file)
Packit 1c1d7e
{
Packit 1c1d7e
  FTextStream t(&file;;
Packit 1c1d7e
  t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",versionString));
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeHeaderFile(QFile &file, const char * /*cssname*/)
Packit 1c1d7e
{
Packit 1c1d7e
  FTextStream t(&file;;
Packit 1c1d7e
  t << "" << endl;
Packit 1c1d7e
  t << ResourceMgr::instance().getAsString("header.html");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeFooterFile(QFile &file)
Packit 1c1d7e
{
Packit 1c1d7e
  FTextStream t(&file;;
Packit 1c1d7e
  t << "" <<  endl;
Packit 1c1d7e
  t << ResourceMgr::instance().getAsString("footer.html");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::startFile(const char *name,const char *,
Packit 1c1d7e
                              const char *title)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("HtmlGenerator::startFile(%s)\n",name);
Packit 1c1d7e
  QCString fileName=name;
Packit 1c1d7e
  lastTitle=title;
Packit 1c1d7e
  relPath = relativePathToRoot(fileName);
Packit 1c1d7e
Packit 1c1d7e
  if (fileName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
Packit 1c1d7e
  {
Packit 1c1d7e
    fileName+=Doxygen::htmlFileExtension;
Packit 1c1d7e
  }
Packit 1c1d7e
  startPlainFile(fileName);
Packit 1c1d7e
  m_codeGen.setTextStream(t);
Packit 1c1d7e
  m_codeGen.setRelativePath(relPath);
Packit 1c1d7e
  Doxygen::indexList->addIndexFile(fileName);
Packit 1c1d7e
Packit 1c1d7e
  lastFile = fileName;
Packit 1c1d7e
  t << substituteHtmlKeywords(g_header,convertToHtml(filterTitle(title)),relPath);
Packit 1c1d7e
Packit 1c1d7e
  t << "
Packit 1c1d7e
    << versionString << " -->" << endl;
Packit 1c1d7e
  //static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
Packit 1c1d7e
  static bool searchEngine = Config_getBool(SEARCHENGINE);
Packit 1c1d7e
  if (searchEngine /*&& !generateTreeView*/)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "<script type=\"text/javascript\">\n";
Packit 1c1d7e
		t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n";
Packit 1c1d7e
		t << "var searchBox = new SearchBox(\"searchBox\", \""
Packit 1c1d7e
      << relPath<< "search\",false,'" << theTranslator->trSearch() << "');\n";
Packit 1c1d7e
		t << "/* @license-end */\n";
Packit 1c1d7e
    t << "</script>\n";
Packit 1c1d7e
  }
Packit 1c1d7e
  //generateDynamicSections(t,relPath);
Packit 1c1d7e
  m_sectionCount=0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeSearchInfo(FTextStream &t,const QCString &relPath)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool searchEngine      = Config_getBool(SEARCHENGINE);
Packit 1c1d7e
  static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
Packit 1c1d7e
  if (searchEngine && !serverBasedSearch)
Packit 1c1d7e
  {
Packit 1c1d7e
    (void)relPath;
Packit 1c1d7e
    t << "\n";
Packit 1c1d7e
    t << "
Packit 1c1d7e
    t << "     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
Packit 1c1d7e
    t << "     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
Packit 1c1d7e
    t << "     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n";
Packit 1c1d7e
    t << "\n";
Packit 1c1d7e
    t << "\n";
Packit 1c1d7e
    t << "\n";
Packit 1c1d7e
    t << "
\n";
Packit 1c1d7e
    t << "
Packit 1c1d7e
    t << "        name=\"MSearchResults\" id=\"MSearchResults\">\n";
Packit 1c1d7e
    t << "</iframe>\n";
Packit 1c1d7e
    t << "\n";
Packit 1c1d7e
    t << "\n";
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeSearchInfo()
Packit 1c1d7e
{
Packit 1c1d7e
  writeSearchInfo(t,relPath);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
QCString HtmlGenerator::writeLogoAsString(const char *path)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool timeStamp = Config_getBool(HTML_TIMESTAMP);
Packit 1c1d7e
  QCString result;
Packit 1c1d7e
  if (timeStamp)
Packit 1c1d7e
  {
Packit 1c1d7e
    result += theTranslator->trGeneratedAt(
Packit 1c1d7e
               dateToString(TRUE),
Packit 1c1d7e
               Config_getString(PROJECT_NAME)
Packit 1c1d7e
              );
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    result += theTranslator->trGeneratedBy();
Packit 1c1d7e
  }
Packit 1c1d7e
  result += " \n\n"
Packit 1c1d7e
            "
Packit 1c1d7e
  result += path;
Packit 1c1d7e
  result += "doxygen.png\" alt=\"doxygen\"/> ";
Packit 1c1d7e
  result += versionString;
Packit 1c1d7e
  result += " ";
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeLogo()
Packit 1c1d7e
{
Packit 1c1d7e
  t << writeLogoAsString(relPath);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writePageFooter(FTextStream &t,const QCString &lastTitle,
Packit 1c1d7e
                              const QCString &relPath,const QCString &navPath)
Packit 1c1d7e
{
Packit 1c1d7e
  t << substituteHtmlKeywords(g_footer,convertToHtml(lastTitle),relPath,navPath);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeFooter(const char *navPath)
Packit 1c1d7e
{
Packit 1c1d7e
  writePageFooter(t,lastTitle,relPath,navPath);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::endFile()
Packit 1c1d7e
{
Packit 1c1d7e
  endPlainFile();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::startProjectNumber()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "

";

Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::endProjectNumber()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeStyleInfo(int part)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("writeStyleInfo(%d)\n",part);
Packit 1c1d7e
  if (part==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (Config_getString(HTML_STYLESHEET).isEmpty()) // write default style sheet
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("write doxygen.css\n");
Packit 1c1d7e
      startPlainFile("doxygen.css");
Packit 1c1d7e
Packit 1c1d7e
      // alternative, cooler looking titles
Packit 1c1d7e
      //t << "H1 { text-align: center; border-width: thin none thin none;" << endl;
Packit 1c1d7e
      //t << "     border-style : double; border-color : blue; padding-left : 1em; padding-right : 1em }" << endl;
Packit 1c1d7e
Packit 1c1d7e
      t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",versionString));
Packit 1c1d7e
      endPlainFile();
Packit 1c1d7e
      Doxygen::indexList->addStyleSheetFile("doxygen.css");
Packit 1c1d7e
    }
Packit 1c1d7e
    else // write user defined style sheet
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString cssname=Config_getString(HTML_STYLESHEET);
Packit 1c1d7e
      QFileInfo cssfi(cssname);
Packit 1c1d7e
      if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
Packit 1c1d7e
      {
Packit 1c1d7e
        err("style sheet %s does not exist or is not readable!", Config_getString(HTML_STYLESHEET).data());
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        // convert style sheet to string
Packit 1c1d7e
        QCString fileStr = fileToString(cssname);
Packit 1c1d7e
        // write the string into the output dir
Packit 1c1d7e
        startPlainFile(cssfi.fileName().utf8());
Packit 1c1d7e
        t << fileStr;
Packit 1c1d7e
        endPlainFile();
Packit 1c1d7e
      }
Packit 1c1d7e
      Doxygen::indexList->addStyleSheetFile(cssfi.fileName().utf8());
Packit 1c1d7e
    }
Packit 1c1d7e
    static QStrList extraCssFile = Config_getList(HTML_EXTRA_STYLESHEET);
Packit 1c1d7e
    for (uint i=0; i
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString fileName(extraCssFile.at(i));
Packit 1c1d7e
      if (!fileName.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        QFileInfo fi(fileName);
Packit 1c1d7e
        if (fi.exists())
Packit 1c1d7e
        {
Packit 1c1d7e
          Doxygen::indexList->addStyleSheetFile(fi.fileName().utf8());
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    Doxygen::indexList->addStyleSheetFile("jquery.js");
Packit 1c1d7e
    Doxygen::indexList->addStyleSheetFile("dynsections.js");
Packit 1c1d7e
    if (Config_getBool(INTERACTIVE_SVG))
Packit 1c1d7e
    {
Packit 1c1d7e
      Doxygen::indexList->addStyleSheetFile("svgpan.js");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::startDoxyAnchor(const char *,const char *,
Packit 1c1d7e
                                    const char *anchor, const char *,
Packit 1c1d7e
                                    const char *)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::endDoxyAnchor(const char *,const char *)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//void HtmlGenerator::newParagraph()
Packit 1c1d7e
//{
Packit 1c1d7e
//  t << endl << "

" << endl;

Packit 1c1d7e
//}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::startParagraph(const char *classDef)
Packit 1c1d7e
{
Packit 1c1d7e
  if (classDef)
Packit 1c1d7e
    t << endl << "

";

Packit 1c1d7e
  else
Packit 1c1d7e
    t << endl << "

";

Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::endParagraph()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "

" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::writeString(const char *text)
Packit 1c1d7e
{
Packit 1c1d7e
  t << text;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlGenerator::startIndexListItem()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "
  • ";
  • Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endIndexListItem()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startIndexItem(const char *ref,const char *f)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f);
    Packit 1c1d7e
      if (ref || f)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (ref)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "
    Packit 1c1d7e
          t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "
    Packit 1c1d7e
        }
    Packit 1c1d7e
        t << "href=\"";
    Packit 1c1d7e
        t << externalRef(relPath,ref,TRUE);
    Packit 1c1d7e
        if (f) t << f << Doxygen::htmlFileExtension << "\">";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endIndexItem(const char *ref,const char *f)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("HtmlGenerator::endIndexItem(%s,%s,%s)\n",ref,f,name);
    Packit 1c1d7e
      if (ref || f)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeStartAnnoItem(const char *,const char *f,
    Packit 1c1d7e
                                           const char *path,const char *name)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
  • ";
  • Packit 1c1d7e
      if (path) docify(path);
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
      docify(name);
    Packit 1c1d7e
      t << " ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeObjectLink(const char *ref,const char *f,
    Packit 1c1d7e
                                        const char *anchor, const char *name)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (ref)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    Packit 1c1d7e
        t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "href=\"";
    Packit 1c1d7e
      t << externalRef(relPath,ref,TRUE);
    Packit 1c1d7e
      if (f) t << f << Doxygen::htmlFileExtension;
    Packit 1c1d7e
      if (anchor) t << "#" << anchor;
    Packit 1c1d7e
      t << "\">";
    Packit 1c1d7e
      docify(name);
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startTextLink(const char *f,const char *anchor)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    Packit 1c1d7e
      if (f)   t << relPath << f << Doxygen::htmlFileExtension;
    Packit 1c1d7e
      if (anchor) t << "#" << anchor;
    Packit 1c1d7e
      t << "\">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endTextLink()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startHtmlLink(const char *url)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
    Packit 1c1d7e
      t << "
    Packit 1c1d7e
      if (generateTreeView) t << "target=\"top\" ";
    Packit 1c1d7e
      t << "href=\"";
    Packit 1c1d7e
      if (url) t << url;
    Packit 1c1d7e
      t << "\">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endHtmlLink()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startGroupHeader(int extraIndentLevel)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (extraIndentLevel==2)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "

    ";

    Packit 1c1d7e
      }
    Packit 1c1d7e
      else if (extraIndentLevel==1)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "

    ";

    Packit 1c1d7e
      }
    Packit 1c1d7e
      else // extraIndentLevel==0
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "

    ";

    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endGroupHeader(int extraIndentLevel)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (extraIndentLevel==2)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else if (extraIndentLevel==1)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      switch(type)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        case SectionInfo::Page:          t << "\n\n

    "; break;

    Packit 1c1d7e
        case SectionInfo::Section:       t << "\n\n

    "; break;

    Packit 1c1d7e
        case SectionInfo::Subsection:    t << "\n\n

    "; break;

    Packit 1c1d7e
        case SectionInfo::Subsubsection: t << "\n\n

    "; break;

    Packit 1c1d7e
        case SectionInfo::Paragraph:     t << "\n\n
    "; break;
    Packit 1c1d7e
        default: ASSERT(0); break;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      switch(type)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        case SectionInfo::Page:          t << ""; break;
    Packit 1c1d7e
        case SectionInfo::Section:       t << ""; break;
    Packit 1c1d7e
        case SectionInfo::Subsection:    t << ""; break;
    Packit 1c1d7e
        case SectionInfo::Subsubsection: t << ""; break;
    Packit 1c1d7e
        case SectionInfo::Paragraph:     t << ""; break;
    Packit 1c1d7e
        default: ASSERT(0); break;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::docify(const char *str)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      docify(str,FALSE);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::docify(const char *str,bool inHtmlComment)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (str)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        const char *p=str;
    Packit 1c1d7e
        char c;
    Packit 1c1d7e
        while (*p)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          c=*p++;
    Packit 1c1d7e
          switch(c)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            case '<':  t << "<"; break;
    Packit 1c1d7e
            case '>':  t << ">"; break;
    Packit 1c1d7e
            case '&':  t << "&"; break;
    Packit 1c1d7e
            case '"':  t << """; break;
    Packit 1c1d7e
            case '-':  if (inHtmlComment) t << "-"; else t << "-"; break;
    Packit 1c1d7e
            case '\\':
    Packit 1c1d7e
                       if (*p=='<')
    Packit 1c1d7e
                         { t << "<"; p++; }
    Packit 1c1d7e
                       else if (*p=='>')
    Packit 1c1d7e
                         { t << ">"; p++; }
    Packit 1c1d7e
                       else
    Packit 1c1d7e
                         t << "\\";
    Packit 1c1d7e
                       break;
    Packit 1c1d7e
            default:   t << c;
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::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
    //--- helper function for dynamic sections -------------------------
    Packit 1c1d7e
    Packit 1c1d7e
    static void startSectionHeader(FTextStream &t,
    Packit 1c1d7e
                                   const QCString &relPath,int sectionCount)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //t << "";
    Packit 1c1d7e
      static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
    Packit 1c1d7e
      if (dynamicSections)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    Packit 1c1d7e
             "onclick=\"return toggleVisibility(this)\" "
    Packit 1c1d7e
             "class=\"dynheader closed\" "
    Packit 1c1d7e
             "style=\"cursor:pointer;\">" << endl;
    Packit 1c1d7e
        t << "  
    Packit 1c1d7e
          << relPath << "closed.png\" alt=\"+\"/> ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void endSectionHeader(FTextStream &t)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //t << "";
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void startSectionSummary(FTextStream &t,int sectionCount)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //t << "";
    Packit 1c1d7e
      static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
    Packit 1c1d7e
      if (dynamicSections)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    Packit 1c1d7e
             "class=\"dynsummary\" "
    Packit 1c1d7e
             "style=\"display:block;\">" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void endSectionSummary(FTextStream &t)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //t << "";
    Packit 1c1d7e
      static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
    Packit 1c1d7e
      if (dynamicSections)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void startSectionContent(FTextStream &t,int sectionCount)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //t << "";
    Packit 1c1d7e
      static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
    Packit 1c1d7e
      if (dynamicSections)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    Packit 1c1d7e
             "class=\"dyncontent\" "
    Packit 1c1d7e
             "style=\"display:none;\">" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void endSectionContent(FTextStream &t)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //t << "";
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    //----------------------------
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startClassDiagram()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      startSectionHeader(t,relPath,m_sectionCount);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
    Packit 1c1d7e
                                    const char *fileName,const char *name)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      endSectionHeader(t);
    Packit 1c1d7e
      startSectionSummary(t,m_sectionCount);
    Packit 1c1d7e
      endSectionSummary(t);
    Packit 1c1d7e
      startSectionContent(t,m_sectionCount);
    Packit 1c1d7e
      t << " 
    " << endl;
    Packit 1c1d7e
      t << "  
    Packit 1c1d7e
      t << relPath << fileName << ".png\" usemap=\"#" << convertToId(name);
    Packit 1c1d7e
      t << "_map\" alt=\"\"/>" << endl;
    Packit 1c1d7e
      t << "  
    Packit 1c1d7e
      t << "_map\" name=\"" << convertToId(name);
    Packit 1c1d7e
      t << "_map\">" << endl;
    Packit 1c1d7e
    Packit 1c1d7e
      d.writeImage(t,dir,relPath,fileName);
    Packit 1c1d7e
      t << " ";
    Packit 1c1d7e
      endSectionContent(t);
    Packit 1c1d7e
      m_sectionCount++;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    // anonymous type:
    Packit 1c1d7e
    //  0 = single column right aligned
    Packit 1c1d7e
    //  1 = double column left aligned
    Packit 1c1d7e
    //  2 = single column left aligned
    Packit 1c1d7e
    void HtmlGenerator::startMemberItem(const char *anchor,int annoType,const char *inheritId)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      if (m_emptySection)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
        m_emptySection=FALSE;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "
    Packit 1c1d7e
      if (inheritId)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " inherit " << inheritId;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "\">";
    Packit 1c1d7e
      switch(annoType)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        case 0:  t << ""; break;
    Packit 1c1d7e
        case 1:  t << ""; break;
    Packit 1c1d7e
        case 2:  t << ""; break;
    Packit 1c1d7e
        default: t << ""; break;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberItem()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
      t << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberTemplateParams()
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberTemplateParams(const char *anchor,const char *inheritId)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
      t << "
    Packit 1c1d7e
      if (inheritId)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " inherit " << inheritId;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "\">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::insertMemberAlign(bool templ)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      QCString className = templ ? "memTemplItemRight" : "memItemRight";
    Packit 1c1d7e
      t << " ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberDescription(const char *anchor,const char *inheritId)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
        if (m_emptySection)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "" << endl;
    Packit 1c1d7e
          m_emptySection=FALSE;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      t << "
    Packit 1c1d7e
      if (inheritId)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " inherit " << inheritId;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "\"> ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberDescription()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      t << "
    " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberSections()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      m_emptySection=TRUE; // we postpone writing  until we actually
    Packit 1c1d7e
                           // write a row to prevent empty tables, which
    Packit 1c1d7e
                           // are not valid XHTML!
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberSections()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      if (!m_emptySection)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberHeader(const char *anchor)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      if (!m_emptySection)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "";
    Packit 1c1d7e
        m_emptySection=TRUE;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if (m_emptySection)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
        m_emptySection=FALSE;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "

    ";

    Packit 1c1d7e
      if (anchor)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberHeader()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberSubtitle()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberSubtitle()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startIndexList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << ""  << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endIndexList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startIndexKey()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      // inserted 'class = ...', 02 jan 2002, jh
    Packit 1c1d7e
      t << "  ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endIndexKey()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startIndexValue(bool)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      // inserted 'class = ...', 02 jan 2002, jh
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endIndexValue(const char *,bool)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberDocList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberDocList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberDoc( const char *clName, const char *memName,
    Packit 1c1d7e
                                        const char *anchor, const char *title,
    Packit 1c1d7e
                                        int memCount, int memTotal, bool showInline)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "\n

    "

    Packit 1c1d7e
        << "◆ ";
    Packit 1c1d7e
      docify(title);
    Packit 1c1d7e
      if (memTotal>1)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " [" << memCount << "/" << memTotal <<"]";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << ""
    Packit 1c1d7e
        << endl;
    Packit 1c1d7e
      t << "\n
    " << endl;
    Packit 1c1d7e
      t << "
    " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberDocPrefixItem()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "
    " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberDocPrefixItem()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberDocName(bool /*align*/)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
    Packit 1c1d7e
      t << "      " << endl;
    Packit 1c1d7e
    Packit 1c1d7e
      t << "        " << endl;
    Packit 1c1d7e
      t << "          ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberDocName()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startParameterList(bool openBracket)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "          ";
    Packit 1c1d7e
      if (openBracket) t << "(";
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startParameterType(bool first,const char *key)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (first)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
        t << "          ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
        t << "        " << endl;
    Packit 1c1d7e
        t << "          ";
    Packit 1c1d7e
        if (key) t << key;
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
        t << "          " << endl;
    Packit 1c1d7e
        t << "          ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endParameterType()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << " " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startParameterName(bool /*oneArgOnly*/)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "          ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      if (last)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (emptyList)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          if (closeBracket) t << ")";
    Packit 1c1d7e
          t << "" << endl;
    Packit 1c1d7e
          t << "          ";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << " " << endl;
    Packit 1c1d7e
          t << "        " << endl;
    Packit 1c1d7e
          t << "        " << endl;
    Packit 1c1d7e
          t << "          " << endl;
    Packit 1c1d7e
          t << "          ";
    Packit 1c1d7e
          if (closeBracket) t << ")";
    Packit 1c1d7e
          t << "" << endl;
    Packit 1c1d7e
          t << "          ";
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
        t << "        " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endParameterList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
      t << "        " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::exceptionEntry(const char* prefix,bool closeBracket)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
      t << "        " << endl;
    Packit 1c1d7e
      t << "        " << endl;
    Packit 1c1d7e
      t << "          ";
    Packit 1c1d7e
      // colspan 2 so it gets both parameter type and parameter name columns
    Packit 1c1d7e
      if (prefix)
    Packit 1c1d7e
        t << prefix << "(";
    Packit 1c1d7e
      else if (closeBracket)
    Packit 1c1d7e
        t << ")";
    Packit 1c1d7e
      else
    Packit 1c1d7e
        t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberDoc(bool hasArgs)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      if (!hasArgs)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "        " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "      " << endl;
    Packit 1c1d7e
     // t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startDotGraph()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      startSectionHeader(t,relPath,m_sectionCount);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endDotGraph(const DotClassGraph &g)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      bool generateLegend = Config_getBool(GENERATE_LEGEND);
    Packit 1c1d7e
      bool umlLook = Config_getBool(UML_LOOK);
    Packit 1c1d7e
      endSectionHeader(t);
    Packit 1c1d7e
      startSectionSummary(t,m_sectionCount);
    Packit 1c1d7e
      endSectionSummary(t);
    Packit 1c1d7e
      startSectionContent(t,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,TRUE,m_sectionCount);
    Packit 1c1d7e
      if (generateLegend && !umlLook)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "<center>[";
    Packit 1c1d7e
        startHtmlLink(relPath+"graph_legend"+Doxygen::htmlFileExtension);
    Packit 1c1d7e
        t << theTranslator->trLegend();
    Packit 1c1d7e
        endHtmlLink();
    Packit 1c1d7e
        t << "]</center>";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      endSectionContent(t);
    Packit 1c1d7e
      m_sectionCount++;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startInclDepGraph()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      startSectionHeader(t,relPath,m_sectionCount);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      endSectionHeader(t);
    Packit 1c1d7e
      startSectionSummary(t,m_sectionCount);
    Packit 1c1d7e
      endSectionSummary(t);
    Packit 1c1d7e
      startSectionContent(t,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      endSectionContent(t);
    Packit 1c1d7e
      m_sectionCount++;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startGroupCollaboration()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      startSectionHeader(t,relPath,m_sectionCount);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      endSectionHeader(t);
    Packit 1c1d7e
      startSectionSummary(t,m_sectionCount);
    Packit 1c1d7e
      endSectionSummary(t);
    Packit 1c1d7e
      startSectionContent(t,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      endSectionContent(t);
    Packit 1c1d7e
      m_sectionCount++;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startCallGraph()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      startSectionHeader(t,relPath,m_sectionCount);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endCallGraph(const DotCallGraph &g)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      endSectionHeader(t);
    Packit 1c1d7e
      startSectionSummary(t,m_sectionCount);
    Packit 1c1d7e
      endSectionSummary(t);
    Packit 1c1d7e
      startSectionContent(t,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      endSectionContent(t);
    Packit 1c1d7e
      m_sectionCount++;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startDirDepGraph()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      startSectionHeader(t,relPath,m_sectionCount);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      endSectionHeader(t);
    Packit 1c1d7e
      startSectionSummary(t,m_sectionCount);
    Packit 1c1d7e
      endSectionSummary(t);
    Packit 1c1d7e
      startSectionContent(t,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
    Packit 1c1d7e
    Packit 1c1d7e
      endSectionContent(t);
    Packit 1c1d7e
      m_sectionCount++;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeGraphicalHierarchy(const DotGfxHierarchyTable &g)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      g.writeGraph(t,dir,fileName);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberGroupHeader(bool)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberGroupHeader()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberGroupDocs()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberGroupDocs()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberGroup()
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberGroup(bool)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startIndent()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
    Packit 1c1d7e
      t << "
    \n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endIndent()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << endl << "" << endl << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::addIndexItem(const char *,const char *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeNonBreakableSpace(int n)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      int i;
    Packit 1c1d7e
      for (i=0;i
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startDescTable(const char *title)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl
    Packit 1c1d7e
        << "" << title << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    void HtmlGenerator::endDescTable()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startDescTableRow()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endDescTableRow()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startDescTableTitle()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endDescTableTitle()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << " ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startDescTableData()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endDescTableData()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startSimpleSect(SectionTypes,
    Packit 1c1d7e
                                    const char *filename,const char *anchor,
    Packit 1c1d7e
                                    const char *title)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    ";
    Packit 1c1d7e
      if (filename)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        writeObjectLink(0,filename,anchor,title);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        docify(title);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endSimpleSect()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startParamList(ParamListTypes,
    Packit 1c1d7e
                                    const char *title)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    ";
    Packit 1c1d7e
      docify(title);
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endParamList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      HtmlDocVisitor *visitor = new HtmlDocVisitor(t,m_codeGen,ctx);
    Packit 1c1d7e
      n->accept(visitor);
    Packit 1c1d7e
      delete visitor;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    //---------------- helpers for index generation -----------------------------
    Packit 1c1d7e
    Packit 1c1d7e
    static void startQuickIndexList(FTextStream &t,bool compact,bool topLevel=TRUE)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (compact)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (topLevel)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "  
    \n";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "  
    \n";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        t << "    
      \n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
      ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void endQuickIndexList(FTextStream &t,bool compact)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (compact)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "    \n";
    Packit 1c1d7e
        t << "  \n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void startQuickIndexItem(FTextStream &t,const char *l,
    Packit 1c1d7e
                                    bool hl,bool /*compact*/,
    Packit 1c1d7e
                                    const QCString &relPath)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "      
    Packit 1c1d7e
      if (hl)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " class=\"current\"";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << ">";
    Packit 1c1d7e
      if (l) t << "";
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void endQuickIndexItem(FTextStream &t,const char *l)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
      if (l) t << "";
    Packit 1c1d7e
      t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static bool quickLinkVisible(LayoutNavEntry::Kind kind)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      static bool showFiles = Config_getBool(SHOW_FILES);
    Packit 1c1d7e
      static bool showNamespaces = Config_getBool(SHOW_NAMESPACES);
    Packit 1c1d7e
      switch (kind)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        case LayoutNavEntry::MainPage:         return TRUE;
    Packit 1c1d7e
        case LayoutNavEntry::User:             return TRUE;
    Packit 1c1d7e
        case LayoutNavEntry::UserGroup:        return TRUE;
    Packit 1c1d7e
        case LayoutNavEntry::Pages:            return indexedPages>0;
    Packit 1c1d7e
        case LayoutNavEntry::Modules:          return documentedGroups>0;
    Packit 1c1d7e
        case LayoutNavEntry::Namespaces:       return documentedNamespaces>0 && showNamespaces;
    Packit 1c1d7e
        case LayoutNavEntry::NamespaceList:    return documentedNamespaces>0 && showNamespaces;
    Packit 1c1d7e
        case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
    Packit 1c1d7e
        case LayoutNavEntry::Classes:          return annotatedClasses>0;
    Packit 1c1d7e
        case LayoutNavEntry::ClassList:        return annotatedClasses>0;
    Packit 1c1d7e
        case LayoutNavEntry::ClassIndex:       return annotatedClasses>0;
    Packit 1c1d7e
        case LayoutNavEntry::ClassHierarchy:   return hierarchyClasses>0;
    Packit 1c1d7e
        case LayoutNavEntry::ClassMembers:     return documentedClassMembers[CMHL_All]>0;
    Packit 1c1d7e
        case LayoutNavEntry::Files:            return documentedHtmlFiles>0 && showFiles;
    Packit 1c1d7e
        case LayoutNavEntry::FileList:         return documentedHtmlFiles>0 && showFiles;
    Packit 1c1d7e
        case LayoutNavEntry::FileGlobals:      return documentedFileMembers[FMHL_All]>0;
    Packit 1c1d7e
        //case LayoutNavEntry::Dirs:             return documentedDirs>0;
    Packit 1c1d7e
        case LayoutNavEntry::Examples:         return Doxygen::exampleSDict->count()>0;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      return FALSE;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void renderQuickLinksAsTree(FTextStream &t,const QCString &relPath,LayoutNavEntry *root)
    Packit 1c1d7e
    Packit 1c1d7e
    {
    Packit 1c1d7e
      QListIterator<LayoutNavEntry> li(root->children());
    Packit 1c1d7e
      LayoutNavEntry *entry;
    Packit 1c1d7e
      int count=0;
    Packit 1c1d7e
      for (li.toFirst();(entry=li.current());++li)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (entry->visible() && quickLinkVisible(entry->kind())) count++;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if (count>0) // at least one item is visible
    Packit 1c1d7e
      {
    Packit 1c1d7e
        startQuickIndexList(t,FALSE);
    Packit 1c1d7e
        for (li.toFirst();(entry=li.current());++li)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          if (entry->visible() && quickLinkVisible(entry->kind()))
    Packit 1c1d7e
          {
    Packit 1c1d7e
            QCString url = entry->url();
    Packit 1c1d7e
            t << "
  • ";
  • Packit 1c1d7e
            t << fixSpaces(entry->title());
    Packit 1c1d7e
            t << "\n";
    Packit 1c1d7e
            // recursive into child list
    Packit 1c1d7e
            renderQuickLinksAsTree(t,relPath,entry);
    Packit 1c1d7e
            t << "";
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        endQuickIndexList(t,FALSE);
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    Packit 1c1d7e
    static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath,
    Packit 1c1d7e
                                 LayoutNavEntry *hlEntry,LayoutNavEntry::Kind kind,
    Packit 1c1d7e
                                 bool highlightParent,bool highlightSearch)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (hlEntry->parent()) // first draw the tabs for the parent of hlEntry
    Packit 1c1d7e
      {
    Packit 1c1d7e
        renderQuickLinksAsTabs(t,relPath,hlEntry->parent(),kind,highlightParent,highlightSearch);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if (hlEntry->parent() && hlEntry->parent()->children().count()>0) // draw tabs for row containing hlEntry
    Packit 1c1d7e
      {
    Packit 1c1d7e
        bool topLevel = hlEntry->parent()->parent()==0;
    Packit 1c1d7e
        QListIterator<LayoutNavEntry> li(hlEntry->parent()->children());
    Packit 1c1d7e
        LayoutNavEntry *entry;
    Packit 1c1d7e
    Packit 1c1d7e
        int count=0;
    Packit 1c1d7e
        for (li.toFirst();(entry=li.current());++li)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          if (entry->visible() && quickLinkVisible(entry->kind())) count++;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (count>0) // at least one item is visible
    Packit 1c1d7e
        {
    Packit 1c1d7e
          startQuickIndexList(t,TRUE,topLevel);
    Packit 1c1d7e
          for (li.toFirst();(entry=li.current());++li)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            if (entry->visible() && quickLinkVisible(entry->kind()))
    Packit 1c1d7e
            {
    Packit 1c1d7e
              QCString url = entry->url();
    Packit 1c1d7e
              startQuickIndexItem(t,url,
    Packit 1c1d7e
                  entry==hlEntry  &&
    Packit 1c1d7e
                  (entry->children().count()>0 ||
    Packit 1c1d7e
                   (entry->kind()==kind && !highlightParent)
    Packit 1c1d7e
                  ),
    Packit 1c1d7e
                  TRUE,relPath);
    Packit 1c1d7e
              t << fixSpaces(entry->title());
    Packit 1c1d7e
              endQuickIndexItem(t,url);
    Packit 1c1d7e
            }
    Packit 1c1d7e
          }
    Packit 1c1d7e
          if (hlEntry->parent()==LayoutDocManager::instance().rootNavEntry()) // first row is special as it contains the search box
    Packit 1c1d7e
          {
    Packit 1c1d7e
            static bool searchEngine      = Config_getBool(SEARCHENGINE);
    Packit 1c1d7e
            static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
    Packit 1c1d7e
            if (searchEngine)
    Packit 1c1d7e
            {
    Packit 1c1d7e
              t << "      
  • \n";
  • Packit 1c1d7e
              if (!serverBasedSearch) // pure client side search
    Packit 1c1d7e
              {
    Packit 1c1d7e
                writeClientSearchBox(t,relPath);
    Packit 1c1d7e
                t << "      \n";
    Packit 1c1d7e
              }
    Packit 1c1d7e
              else // server based search
    Packit 1c1d7e
              {
    Packit 1c1d7e
                writeServerSearchBox(t,relPath,highlightSearch);
    Packit 1c1d7e
                if (!highlightSearch)
    Packit 1c1d7e
                {
    Packit 1c1d7e
                  t << "      \n";
    Packit 1c1d7e
                }
    Packit 1c1d7e
              }
    Packit 1c1d7e
            }
    Packit 1c1d7e
            if (!highlightSearch) // on the search page the index will be ended by the
    Packit 1c1d7e
              // page itself
    Packit 1c1d7e
            {
    Packit 1c1d7e
              endQuickIndexList(t,TRUE);
    Packit 1c1d7e
            }
    Packit 1c1d7e
          }
    Packit 1c1d7e
          else // normal case for other rows than first one
    Packit 1c1d7e
          {
    Packit 1c1d7e
            endQuickIndexList(t,TRUE);
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static void writeDefaultQuickLinks(FTextStream &t,bool compact,
    Packit 1c1d7e
                                       HighlightedItem hli,
    Packit 1c1d7e
                                       const char *file,
    Packit 1c1d7e
                                       const QCString &relPath)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
    Packit 1c1d7e
      static bool searchEngine = Config_getBool(SEARCHENGINE);
    Packit 1c1d7e
      static bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
    Packit 1c1d7e
      LayoutNavEntry *root = LayoutDocManager::instance().rootNavEntry();
    Packit 1c1d7e
      LayoutNavEntry::Kind kind = (LayoutNavEntry::Kind)-1;
    Packit 1c1d7e
      LayoutNavEntry::Kind altKind = (LayoutNavEntry::Kind)-1; // fall back for the old layout file
    Packit 1c1d7e
      bool highlightParent=FALSE;
    Packit 1c1d7e
      switch (hli) // map HLI enums to LayoutNavEntry::Kind enums
    Packit 1c1d7e
      {
    Packit 1c1d7e
        case HLI_Main:             kind = LayoutNavEntry::MainPage;         break;
    Packit 1c1d7e
        case HLI_Modules:          kind = LayoutNavEntry::Modules;          break;
    Packit 1c1d7e
        //case HLI_Directories:      kind = LayoutNavEntry::Dirs;             break;
    Packit 1c1d7e
        case HLI_Namespaces:       kind = LayoutNavEntry::NamespaceList;    altKind = LayoutNavEntry::Namespaces;  break;
    Packit 1c1d7e
        case HLI_Hierarchy:        kind = LayoutNavEntry::ClassHierarchy;   break;
    Packit 1c1d7e
        case HLI_Classes:          kind = LayoutNavEntry::ClassIndex;       altKind = LayoutNavEntry::Classes;     break;
    Packit 1c1d7e
        case HLI_Annotated:        kind = LayoutNavEntry::ClassList;        altKind = LayoutNavEntry::Classes;     break;
    Packit 1c1d7e
        case HLI_Files:            kind = LayoutNavEntry::FileList;         altKind = LayoutNavEntry::Files;       break;
    Packit 1c1d7e
        case HLI_NamespaceMembers: kind = LayoutNavEntry::NamespaceMembers; break;
    Packit 1c1d7e
        case HLI_Functions:        kind = LayoutNavEntry::ClassMembers;     break;
    Packit 1c1d7e
        case HLI_Globals:          kind = LayoutNavEntry::FileGlobals;      break;
    Packit 1c1d7e
        case HLI_Pages:            kind = LayoutNavEntry::Pages;            break;
    Packit 1c1d7e
        case HLI_Examples:         kind = LayoutNavEntry::Examples;         break;
    Packit 1c1d7e
        case HLI_UserGroup:        kind = LayoutNavEntry::UserGroup;        break;
    Packit 1c1d7e
        case HLI_ClassVisible:     kind = LayoutNavEntry::ClassList;        altKind = LayoutNavEntry::Classes;
    Packit 1c1d7e
                                   highlightParent = TRUE; break;
    Packit 1c1d7e
        case HLI_NamespaceVisible: kind = LayoutNavEntry::NamespaceList;    altKind = LayoutNavEntry::Namespaces;
    Packit 1c1d7e
                                   highlightParent = TRUE; break;
    Packit 1c1d7e
        case HLI_FileVisible:      kind = LayoutNavEntry::FileList;         altKind = LayoutNavEntry::Files;
    Packit 1c1d7e
                                   highlightParent = TRUE; break;
    Packit 1c1d7e
        case HLI_None:   break;
    Packit 1c1d7e
        case HLI_Search: break;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      if (compact && Config_getBool(HTML_DYNAMIC_MENUS))
    Packit 1c1d7e
      {
    Packit 1c1d7e
        QCString searchPage;
    Packit 1c1d7e
        if (externalSearch)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          searchPage = "search" + Doxygen::htmlFileExtension;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          searchPage = "search.php";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        t << "<script type=\"text/javascript\" src=\"" << relPath << "menudata.js\"></script>" << endl;
    Packit 1c1d7e
        t << "<script type=\"text/javascript\" src=\"" << relPath << "menu.js\"></script>" << endl;
    Packit 1c1d7e
        t << "<script type=\"text/javascript\">" << endl;
    Packit 1c1d7e
    		t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n";
    Packit 1c1d7e
        t << "$(function() {" << endl;
    Packit 1c1d7e
        t << "  initMenu('" << relPath << "',"
    Packit 1c1d7e
          << (searchEngine?"true":"false") << ","
    Packit 1c1d7e
          << (serverBasedSearch?"true":"false") << ",'"
    Packit 1c1d7e
          << searchPage << "','"
    Packit 1c1d7e
          << theTranslator->trSearch() << "');" << endl;
    Packit 1c1d7e
        if (Config_getBool(SEARCHENGINE))
    Packit 1c1d7e
        {
    Packit 1c1d7e
          if (!serverBasedSearch)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            t << "  $(document).ready(function() { init_search(); });\n";
    Packit 1c1d7e
          }
    Packit 1c1d7e
          else
    Packit 1c1d7e
          {
    Packit 1c1d7e
    				t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n";
    Packit 1c1d7e
            t << "  $(document).ready(function() {\n"
    Packit 1c1d7e
              << "    if ($('.searchresults').length > 0) { searchBox.DOMSearchField().focus(); }\n"
    Packit 1c1d7e
              << "  });\n";
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        t << "});" << endl;
    Packit 1c1d7e
    		t << "/* @license-end */";
    Packit 1c1d7e
        t << "</script>" << endl;
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else if (compact) // && !Config_getBool(HTML_DYNAMIC_MENUS)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        // find highlighted index item
    Packit 1c1d7e
        LayoutNavEntry *hlEntry = root->find(kind,kind==LayoutNavEntry::UserGroup ? file : 0);
    Packit 1c1d7e
        if (!hlEntry && altKind!=(LayoutNavEntry::Kind)-1) { hlEntry=root->find(altKind); kind=altKind; }
    Packit 1c1d7e
        if (!hlEntry) // highlighted item not found in the index! -> just show the level 1 index...
    Packit 1c1d7e
        {
    Packit 1c1d7e
          highlightParent=TRUE;
    Packit 1c1d7e
          hlEntry = root->children().getFirst();
    Packit 1c1d7e
          if (hlEntry==0)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            return; // argl, empty index!
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (kind==LayoutNavEntry::UserGroup)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          LayoutNavEntry *e = hlEntry->children().getFirst();
    Packit 1c1d7e
          if (e)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            hlEntry = e;
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        renderQuickLinksAsTabs(t,relPath,hlEntry,kind,highlightParent,hli==HLI_Search);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        renderQuickLinksAsTree(t,relPath,root);
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endQuickIndices()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    QCString HtmlGenerator::writeSplitBarAsString(const char *name,const char *relpath)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
    Packit 1c1d7e
      QCString result;
    Packit 1c1d7e
      // write split bar
    Packit 1c1d7e
      if (generateTreeView)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        result = QCString(
    Packit 1c1d7e
    											"
    \n"
    Packit 1c1d7e
    											"  
    \n"
    Packit 1c1d7e
    											"    
    \n"
    Packit 1c1d7e
    											"      
    \n"
    Packit 1c1d7e
    											"    \n"
    Packit 1c1d7e
    											"  \n"
    Packit 1c1d7e
    											"  
    Packit 1c1d7e
    											"       class=\"ui-resizable-handle\">\n"
    Packit 1c1d7e
    											"  \n"
    Packit 1c1d7e
    											"\n"
    Packit 1c1d7e
    											"<script type=\"text/javascript\">\n"
    Packit 1c1d7e
    											"/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n"
    Packit 1c1d7e
    											"$(document).ready(function(){initNavTree('") +
    Packit 1c1d7e
    			QCString(name) + Doxygen::htmlFileExtension +
    Packit 1c1d7e
    			QCString("','") + relpath +
    Packit 1c1d7e
    			QCString("');});\n"
    Packit 1c1d7e
    							 "/* @license-end */\n"
    Packit 1c1d7e
    							 "</script>\n"
    Packit 1c1d7e
    							 "
    \n");
    Packit 1c1d7e
      }
    Packit 1c1d7e
      return result;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeSplitBar(const char *name)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << writeSplitBarAsString(name,relPath);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeNavigationPath(const char *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << substitute(s,"$relpath^",relPath);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startContents()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endContents()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli,const char *file)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      writeDefaultQuickLinks(t,compact,hli,file,relPath);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    // PHP based search script
    Packit 1c1d7e
    void HtmlGenerator::writeSearchPage()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
    Packit 1c1d7e
      static bool disableIndex = Config_getBool(DISABLE_INDEX);
    Packit 1c1d7e
      static QCString projectName = Config_getString(PROJECT_NAME);
    Packit 1c1d7e
      static QCString htmlOutput = Config_getString(HTML_OUTPUT);
    Packit 1c1d7e
    Packit 1c1d7e
      // OPENSEARCH_PROVIDER {
    Packit 1c1d7e
      QCString configFileName = htmlOutput+"/search_config.php";
    Packit 1c1d7e
      QFile cf(configFileName);
    Packit 1c1d7e
      if (cf.open(IO_WriteOnly))
    Packit 1c1d7e
      {
    Packit 1c1d7e
        FTextStream t(&cf);
    Packit 1c1d7e
        t << "<script language=\"php\">\n\n";
    Packit 1c1d7e
        t << "$config = array(\n";
    Packit 1c1d7e
        t << "  'PROJECT_NAME' => \"" << convertToHtml(projectName) << "\",\n";
    Packit 1c1d7e
        t << "  'GENERATE_TREEVIEW' => " << (generateTreeView?"true":"false") << ",\n";
    Packit 1c1d7e
        t << "  'DISABLE_INDEX' => " << (disableIndex?"true":"false") << ",\n";
    Packit 1c1d7e
        t << ");\n\n";
    Packit 1c1d7e
        t << "$translator = array(\n";
    Packit 1c1d7e
        t << "  'search_results_title' => \"" << theTranslator->trSearchResultsTitle() << "\",\n";
    Packit 1c1d7e
        t << "  'search_results' => array(\n";
    Packit 1c1d7e
        t << "    0 => \"" << theTranslator->trSearchResults(0) << "\",\n";
    Packit 1c1d7e
        t << "    1 => \"" << theTranslator->trSearchResults(1) << "\",\n";
    Packit 1c1d7e
        t << "    2 => \"" << substitute(theTranslator->trSearchResults(2), "$", "\\$") << "\",\n";
    Packit 1c1d7e
        t << "  ),\n";
    Packit 1c1d7e
        t << "  'search_matches' => \"" << theTranslator->trSearchMatches() << "\",\n";
    Packit 1c1d7e
        t << "  'search' => \"" << theTranslator->trSearch() << "\",\n";
    Packit 1c1d7e
        t << "  'split_bar' => \"" << substitute(substitute(writeSplitBarAsString("search",""), "\"","\\\""), "\n","\\n") << "\",\n";
    Packit 1c1d7e
        t << "  'logo' => \"" << substitute(substitute(writeLogoAsString(""), "\"","\\\""), "\n","\\n") << "\",\n";
    Packit 1c1d7e
        t << ");\n\n";
    Packit 1c1d7e
        t << "</script>\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      ResourceMgr::instance().copyResource("search_functions.php",htmlOutput);
    Packit 1c1d7e
      ResourceMgr::instance().copyResource("search_opensearch.php",htmlOutput);
    Packit 1c1d7e
      // OPENSEARCH_PROVIDER }
    Packit 1c1d7e
    Packit 1c1d7e
      QCString fileName = htmlOutput+"/search.php";
    Packit 1c1d7e
      QFile f(fileName);
    Packit 1c1d7e
      if (f.open(IO_WriteOnly))
    Packit 1c1d7e
      {
    Packit 1c1d7e
        FTextStream t(&f);
    Packit 1c1d7e
        t << substituteHtmlKeywords(g_header,"Search","");
    Packit 1c1d7e
    Packit 1c1d7e
        t << "
    Packit 1c1d7e
          << versionString << " -->" << endl;
    Packit 1c1d7e
        t << "<script type=\"text/javascript\">\n";
    Packit 1c1d7e
    		t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n";
    Packit 1c1d7e
    		t << "var searchBox = new SearchBox(\"searchBox\", \""
    Packit 1c1d7e
          << "search\",false,'" << theTranslator->trSearch() << "');\n";
    Packit 1c1d7e
    		t << "/* @license-end */\n";
    Packit 1c1d7e
        t << "</script>\n";
    Packit 1c1d7e
        if (!Config_getBool(DISABLE_INDEX))
    Packit 1c1d7e
        {
    Packit 1c1d7e
          writeDefaultQuickLinks(t,TRUE,HLI_Search,0,"");
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "" << endl;
    Packit 1c1d7e
        }
    Packit 1c1d7e
    Packit 1c1d7e
        t << "<script language=\"php\">\n";
    Packit 1c1d7e
        t << "require_once \"search_functions.php\";\n";
    Packit 1c1d7e
        t << "main();\n";
    Packit 1c1d7e
        t << "</script>\n";
    Packit 1c1d7e
    Packit 1c1d7e
        // Write empty navigation path, to make footer connect properly
    Packit 1c1d7e
        if (generateTreeView)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "\n";
    Packit 1c1d7e
        }
    Packit 1c1d7e
    Packit 1c1d7e
        writePageFooter(t,"Search","","");
    Packit 1c1d7e
      }
    Packit 1c1d7e
      QCString scriptName = htmlOutput+"/search/search.js";
    Packit 1c1d7e
      QFile sf(scriptName);
    Packit 1c1d7e
      if (sf.open(IO_WriteOnly))
    Packit 1c1d7e
      {
    Packit 1c1d7e
        FTextStream t(&sf);
    Packit 1c1d7e
        t << ResourceMgr::instance().getAsString("extsearch.js");
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
         err("Failed to open file '%s' for writing...\n",scriptName.data());
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeExternalSearchPage()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
    Packit 1c1d7e
      static bool disableIndex = Config_getBool(DISABLE_INDEX);
    Packit 1c1d7e
      QCString fileName = Config_getString(HTML_OUTPUT)+"/search"+Doxygen::htmlFileExtension;
    Packit 1c1d7e
      QFile f(fileName);
    Packit 1c1d7e
      if (f.open(IO_WriteOnly))
    Packit 1c1d7e
      {
    Packit 1c1d7e
        FTextStream t(&f);
    Packit 1c1d7e
        t << substituteHtmlKeywords(g_header,"Search","");
    Packit 1c1d7e
    Packit 1c1d7e
        t << "
    Packit 1c1d7e
          << versionString << " -->" << endl;
    Packit 1c1d7e
        t << "<script type=\"text/javascript\">\n";
    Packit 1c1d7e
    		t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */\n";
    Packit 1c1d7e
    		t << "var searchBox = new SearchBox(\"searchBox\", \""
    Packit 1c1d7e
          << "search\",false,'" << theTranslator->trSearch() << "');\n";
    Packit 1c1d7e
    		t << "/* @license-end */\n";
    Packit 1c1d7e
        t << "</script>\n";
    Packit 1c1d7e
        if (!Config_getBool(DISABLE_INDEX))
    Packit 1c1d7e
        {
    Packit 1c1d7e
          writeDefaultQuickLinks(t,TRUE,HLI_Search,0,"");
    Packit 1c1d7e
          t << "            <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" size=\"20\" accesskey=\"S\" onfocus=\"searchBox.OnSearchFieldFocus(true)\" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
    Packit 1c1d7e
          t << "            </form>\n";
    Packit 1c1d7e
          t << "          
    \n";
    Packit 1c1d7e
          t << "        \n";
    Packit 1c1d7e
          t << "      \n";
    Packit 1c1d7e
          t << "    \n";
    Packit 1c1d7e
          t << "  \n";
    Packit 1c1d7e
          t << "\n";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "" << endl;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        t << writeSplitBarAsString("search","");
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
        t << "  
    " << endl;
    Packit 1c1d7e
        t << "    
    " << theTranslator->trSearchResultsTitle() << "
    " << endl;
    Packit 1c1d7e
        t << "  " << endl;
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
    Packit 1c1d7e
        if (generateTreeView)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          t << "" << endl;
    Packit 1c1d7e
        }
    Packit 1c1d7e
    Packit 1c1d7e
        writePageFooter(t,"Search","","");
    Packit 1c1d7e
    Packit 1c1d7e
      }
    Packit 1c1d7e
      QCString scriptName = Config_getString(HTML_OUTPUT)+"/search/search.js";
    Packit 1c1d7e
      QFile sf(scriptName);
    Packit 1c1d7e
      if (sf.open(IO_WriteOnly))
    Packit 1c1d7e
      {
    Packit 1c1d7e
        FTextStream t(&sf);
    Packit 1c1d7e
        t << "var searchResultsText=["
    Packit 1c1d7e
          << "\"" << theTranslator->trSearchResults(0) << "\","
    Packit 1c1d7e
          << "\"" << theTranslator->trSearchResults(1) << "\","
    Packit 1c1d7e
          << "\"" << theTranslator->trSearchResults(2) << "\"];" << endl;
    Packit 1c1d7e
        t << "var serverUrl=\"" << Config_getString(SEARCHENGINE_URL) << "\";" << endl;
    Packit 1c1d7e
        t << "var tagMap = {" << endl;
    Packit 1c1d7e
        bool first=TRUE;
    Packit 1c1d7e
        // add search mappings
    Packit 1c1d7e
        QStrList &extraSearchMappings = Config_getList(EXTRA_SEARCH_MAPPINGS);
    Packit 1c1d7e
        char *ml=extraSearchMappings.first();
    Packit 1c1d7e
        while (ml)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          QCString mapLine = ml;
    Packit 1c1d7e
          int eqPos = mapLine.find('=');
    Packit 1c1d7e
          if (eqPos!=-1) // tag command contains a destination
    Packit 1c1d7e
          {
    Packit 1c1d7e
            QCString tagName = mapLine.left(eqPos).stripWhiteSpace();
    Packit 1c1d7e
            QCString destName = mapLine.right(mapLine.length()-eqPos-1).stripWhiteSpace();
    Packit 1c1d7e
            if (!tagName.isEmpty())
    Packit 1c1d7e
            {
    Packit 1c1d7e
              if (!first) t << "," << endl;
    Packit 1c1d7e
              t << "  \"" << tagName << "\": \"" << destName << "\"";
    Packit 1c1d7e
              first=FALSE;
    Packit 1c1d7e
            }
    Packit 1c1d7e
          }
    Packit 1c1d7e
          ml=extraSearchMappings.next();
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (!first) t << endl;
    Packit 1c1d7e
        t << "};" << endl << endl;
    Packit 1c1d7e
        t << ResourceMgr::instance().getAsString("extsearch.js");
    Packit 1c1d7e
        t << endl;
    Packit 1c1d7e
        t << "$(document).ready(function() {" << endl;
    Packit 1c1d7e
        t << "  var query = trim(getURLParameter('query'));" << endl;
    Packit 1c1d7e
        t << "  if (query) {" << endl;
    Packit 1c1d7e
        t << "    searchFor(query,0,20);" << endl;
    Packit 1c1d7e
        t << "  } else {" << endl;
    Packit 1c1d7e
        t << "    var results = $('#results');" << endl;
    Packit 1c1d7e
        t << "    results.html('

    " << theTranslator->trSearchResults(0) << "

    ');" << endl;
    Packit 1c1d7e
        t << "  }" << endl;
    Packit 1c1d7e
        t << "});" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
         err("Failed to open file '%s' for writing...\n",scriptName.data());
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startConstraintList(const char *header)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    " << endl;
    Packit 1c1d7e
      t << "
    " << header << "
    " << endl;
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startConstraintParam()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endConstraintParam()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startConstraintType()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << " :";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endConstraintType()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startConstraintDocs()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << " ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endConstraintDocs()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endConstraintList()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::lineBreak(const char *style)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (style)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startHeaderSection()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startTitleHead(const char *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "  
    " << endl;
    Packit 1c1d7e
      startTitle();
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endTitleHead(const char *,const char *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      endTitle();
    Packit 1c1d7e
      t << "  " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endHeaderSection()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startInlineHeader()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_emptySection)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "" << endl;
    Packit 1c1d7e
        m_emptySection=FALSE;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "

    ";

    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endInlineHeader()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startMemberDocSimple(bool isEnum)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
      t << (isEnum? theTranslator->trEnumerationValues() :
    Packit 1c1d7e
           theTranslator->trCompoundMembers()) << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberDocSimple(bool)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startInlineMemberType()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endInlineMemberType()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startInlineMemberName()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endInlineMemberName()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startInlineMemberDoc()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endInlineMemberDoc()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::startLabels()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeLabel(const char *l,bool /*isLast*/)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      //t << "<tt>[" << l << "]</tt>";
    Packit 1c1d7e
      //if (!isLast) t << ", ";
    Packit 1c1d7e
      t << "" << l << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endLabels()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeInheritedSectionTitle(
    Packit 1c1d7e
                      const char *id,    const char *ref,
    Packit 1c1d7e
                      const char *file,  const char *anchor,
    Packit 1c1d7e
                      const char *title, const char *name)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      DBG_HTML(t << "" << endl;)
    Packit 1c1d7e
      QCString a = anchor;
    Packit 1c1d7e
      if (!a.isEmpty()) a.prepend("#");
    Packit 1c1d7e
      QCString classLink = QCString("
    Packit 1c1d7e
      if (ref)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        classLink+= externalLinkTarget() + externalRef(relPath,ref,TRUE);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        classLink+=relPath;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      classLink+=file+Doxygen::htmlFileExtension+a;
    Packit 1c1d7e
      classLink+=QCString("\">")+convertToHtml(name,FALSE)+"";
    Packit 1c1d7e
      t << ""
    Packit 1c1d7e
        << ""
    Packit 1c1d7e
        << "\"-\"/ "
    Packit 1c1d7e
        << theTranslator->trInheritedFrom(convertToHtml(title,FALSE),classLink)
    Packit 1c1d7e
        << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::writeSummaryLink(const char *file,const char *anchor,const char *title,bool first)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (first)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "  
    \n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " |\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "
    Packit 1c1d7e
      if (file)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << relPath << file;
    Packit 1c1d7e
        t << Doxygen::htmlFileExtension;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << "#";
    Packit 1c1d7e
        t << anchor;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "\">";
    Packit 1c1d7e
      t << title;
    Packit 1c1d7e
      t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::endMemberDeclaration(const char *anchor,const char *inheritId)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      t << "
    Packit 1c1d7e
      if (inheritId)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        t << " inherit " << inheritId;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      t << "\"> \n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::setCurrentDoc(Definition *context,const char *anchor,bool isSourceFile)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (Doxygen::searchIndex)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        Doxygen::searchIndex->setCurrentDoc(context,anchor,isSourceFile);
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlGenerator::addWord(const char *word,bool hiPriority)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (Doxygen::searchIndex)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        Doxygen::searchIndex->addWord(word,hiPriority);
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }