Blame addon/doxywizard/expert.cpp

Packit 1c1d7e
#include "expert.h"
Packit 1c1d7e
#include "inputbool.h"
Packit 1c1d7e
#include "inputstring.h"
Packit 1c1d7e
#include "inputint.h"
Packit 1c1d7e
#include "inputstring.h"
Packit 1c1d7e
#include "inputstrlist.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "version.h"
Packit 1c1d7e
#include "configdoc.h"
Packit 1c1d7e
#include "settings.h"
Packit 1c1d7e
Packit 1c1d7e
#include <QTreeWidget>
Packit 1c1d7e
#include <QStackedWidget>
Packit 1c1d7e
#include <QTextBrowser>
Packit 1c1d7e
#include <QSplitter>
Packit 1c1d7e
#include <QGridLayout>
Packit 1c1d7e
#include <QPushButton>
Packit 1c1d7e
#include <QScrollArea>
Packit 1c1d7e
#include <QFile>
Packit 1c1d7e
#include <QMessageBox>
Packit 1c1d7e
#include <QSettings>
Packit 1c1d7e
#include <QTextStream>
Packit 1c1d7e
#include <QTextCodec>
Packit 1c1d7e
#include <QFileInfo>
Packit 1c1d7e
Packit 1c1d7e
#define SA(x) QString::fromLatin1(x)
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static QString convertToComment(const QString &s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (s.isEmpty()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    return QString();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    return SA("# ")+
Packit 1c1d7e
           s.trimmed().replace(SA("\n"),SA("\n# ")).replace(SA("# \n"), SA("#\n"))+
Packit 1c1d7e
           SA("\n");
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::setHeader(const char *header)
Packit 1c1d7e
{
Packit 1c1d7e
  m_header = SA(header);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::add(const char *name,const char *docs)
Packit 1c1d7e
{
Packit 1c1d7e
  Input *opt = m_options[SA(name)];
Packit 1c1d7e
  if (opt)
Packit 1c1d7e
  {
Packit 1c1d7e
    opt->setTemplateDocs(SA(docs));
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//------------------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
Expert::Expert()
Packit 1c1d7e
{
Packit 1c1d7e
  m_treeWidget = new QTreeWidget;
Packit 1c1d7e
  m_treeWidget->setColumnCount(1);
Packit 1c1d7e
  m_topicStack = new QStackedWidget;
Packit 1c1d7e
  m_inShowHelp = false;
Packit 1c1d7e
Packit 1c1d7e
  QFile file(SA(":/config.xml"));
Packit 1c1d7e
  QString err;
Packit 1c1d7e
  int errLine,errCol;
Packit 1c1d7e
  QDomDocument configXml;
Packit 1c1d7e
  if (file.open(QIODevice::ReadOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!configXml.setContent(&file,false,&err,&errLine,&errCol))
Packit 1c1d7e
    {
Packit 1c1d7e
      QString msg = tr("Error parsing internal config.xml at line %1 column %2.\n%3").
Packit 1c1d7e
                  arg(errLine).arg(errCol).arg(err);
Packit 1c1d7e
      QMessageBox::warning(this, tr("Error"), msg);
Packit 1c1d7e
      exit(1);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  m_rootElement = configXml.documentElement();
Packit 1c1d7e
Packit 1c1d7e
  createTopics(m_rootElement);
Packit 1c1d7e
  m_helper = new QTextBrowser;
Packit 1c1d7e
  m_helper->setReadOnly(true);
Packit 1c1d7e
  m_helper->setOpenExternalLinks(true);
Packit 1c1d7e
  m_splitter = new QSplitter(Qt::Vertical);
Packit 1c1d7e
  m_splitter->addWidget(m_treeWidget);
Packit 1c1d7e
  m_splitter->addWidget(m_helper);
Packit 1c1d7e
Packit 1c1d7e
  QWidget *rightSide = new QWidget;
Packit 1c1d7e
  QGridLayout *grid = new QGridLayout(rightSide);
Packit 1c1d7e
  m_prev = new QPushButton(tr("Previous"));
Packit 1c1d7e
  m_prev->setEnabled(false);
Packit 1c1d7e
  m_next = new QPushButton(tr("Next"));
Packit 1c1d7e
  grid->addWidget(m_topicStack,0,0,1,2);
Packit 1c1d7e
  grid->addWidget(m_prev,1,0,Qt::AlignLeft);
Packit 1c1d7e
  grid->addWidget(m_next,1,1,Qt::AlignRight);
Packit 1c1d7e
  grid->setColumnStretch(0,1);
Packit 1c1d7e
  grid->setRowStretch(0,1);
Packit 1c1d7e
Packit 1c1d7e
  addWidget(m_splitter);
Packit 1c1d7e
  addWidget(rightSide);
Packit 1c1d7e
  connect(m_next,SIGNAL(clicked()),SLOT(nextTopic()));
Packit 1c1d7e
Packit 1c1d7e
  connect(m_prev,SIGNAL(clicked()),SLOT(prevTopic()));
Packit 1c1d7e
Packit 1c1d7e
  addConfigDocs(this);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Expert::~Expert()
Packit 1c1d7e
{
Packit 1c1d7e
  QHashIterator<QString,Input*> i(m_options);
Packit 1c1d7e
  while (i.hasNext()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    i.next();
Packit 1c1d7e
    delete i.value();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::createTopics(const QDomElement &rootElem)
Packit 1c1d7e
{
Packit 1c1d7e
  QList<QTreeWidgetItem*> items;
Packit 1c1d7e
  QDomElement childElem = rootElem.firstChildElement();
Packit 1c1d7e
  while (!childElem.isNull())
Packit 1c1d7e
  {
Packit 1c1d7e
    if (childElem.tagName()==SA("group"))
Packit 1c1d7e
    {
Packit 1c1d7e
      // Remove _ from a group name like: Source_Browser
Packit 1c1d7e
      QString name = childElem.attribute(SA("name")).replace(SA("_"),SA(" "));
Packit 1c1d7e
      items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(name)));
Packit 1c1d7e
      QWidget *widget = createTopicWidget(childElem);
Packit 1c1d7e
      m_topics[name] = widget;
Packit 1c1d7e
      m_topicStack->addWidget(widget);
Packit 1c1d7e
    }
Packit 1c1d7e
    childElem = childElem.nextSiblingElement();
Packit 1c1d7e
  }
Packit 1c1d7e
  m_treeWidget->setHeaderLabels(QStringList() << SA("Topics"));
Packit 1c1d7e
  m_treeWidget->insertTopLevelItems(0,items);
Packit 1c1d7e
  connect(m_treeWidget,
Packit 1c1d7e
          SIGNAL(currentItemChanged(QTreeWidgetItem *,QTreeWidgetItem *)),
Packit 1c1d7e
          this,
Packit 1c1d7e
          SLOT(activateTopic(QTreeWidgetItem *,QTreeWidgetItem *)));
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QString getDocsForNode(const QDomElement &child)
Packit 1c1d7e
{
Packit 1c1d7e
  QString type = child.attribute(SA("type"));
Packit 1c1d7e
  QString docs = SA("");
Packit 1c1d7e
  // read documentation text
Packit 1c1d7e
  QDomElement docsVal = child.firstChildElement();
Packit 1c1d7e
  while (!docsVal.isNull())
Packit 1c1d7e
  {
Packit 1c1d7e
    if (docsVal.tagName()==SA("docs") &&
Packit 1c1d7e
        docsVal.attribute(SA("doxywizard")) != SA("0"))
Packit 1c1d7e
    {
Packit 1c1d7e
      for (QDomNode n = docsVal.firstChild(); !n.isNull(); n = n.nextSibling())
Packit 1c1d7e
      {
Packit 1c1d7e
        QDomText t = n.toText();
Packit 1c1d7e
        if (!t.isNull()) docs+=t.data();
Packit 1c1d7e
      }
Packit 1c1d7e
      docs += SA("
");
Packit 1c1d7e
    }
Packit 1c1d7e
    docsVal = docsVal.nextSiblingElement();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // for an enum we list the values
Packit 1c1d7e
  if (type==SA("enum"))
Packit 1c1d7e
  {
Packit 1c1d7e
    docs += SA("
");
Packit 1c1d7e
    docs += SA("Possible values are: ");
Packit 1c1d7e
    int numValues=0;
Packit 1c1d7e
    docsVal = child.firstChildElement();
Packit 1c1d7e
    while (!docsVal.isNull())
Packit 1c1d7e
    {
Packit 1c1d7e
      if (docsVal.tagName()==SA("value"))
Packit 1c1d7e
      {
Packit 1c1d7e
        numValues++;
Packit 1c1d7e
      }
Packit 1c1d7e
      docsVal = docsVal.nextSiblingElement();
Packit 1c1d7e
    }
Packit 1c1d7e
    int i=0;
Packit 1c1d7e
    docsVal = child.firstChildElement();
Packit 1c1d7e
    while (!docsVal.isNull())
Packit 1c1d7e
    {
Packit 1c1d7e
      if (docsVal.tagName()==SA("value"))
Packit 1c1d7e
      {
Packit 1c1d7e
        i++;
Packit 1c1d7e
        docs += SA("") + docsVal.attribute(SA("name")) + SA("");
Packit 1c1d7e
        QString desc = docsVal.attribute(SA("desc"));
Packit 1c1d7e
        if (!desc.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          docs+= SA(" ")+desc;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (i==numValues-1)
Packit 1c1d7e
        {
Packit 1c1d7e
          docs+=SA(" and ");
Packit 1c1d7e
        }
Packit 1c1d7e
        else if (i==numValues)
Packit 1c1d7e
        {
Packit 1c1d7e
          docs+=SA(".");
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          docs+=SA(", ");
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      docsVal = docsVal.nextSiblingElement();
Packit 1c1d7e
    }
Packit 1c1d7e
    docs+=SA("
");
Packit 1c1d7e
    docs+=SA("
");
Packit 1c1d7e
    docs+=SA(" The default value is: ")+
Packit 1c1d7e
          child.attribute(SA("defval"))+
Packit 1c1d7e
          SA(".");
Packit 1c1d7e
    docs+= SA("
");
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (type==SA("int"))
Packit 1c1d7e
  {
Packit 1c1d7e
    docs+=SA("
");
Packit 1c1d7e
    docs+=SA("Minimum value: ")+child.attribute(SA("minval"))+SA(", ");
Packit 1c1d7e
    docs+=SA("maximum value: ")+child.attribute(SA("maxval"))+SA(", ");
Packit 1c1d7e
    docs+=SA("default value: ")+child.attribute(SA("defval"))+SA(".");
Packit 1c1d7e
    docs+= SA("
");
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (type==SA("bool"))
Packit 1c1d7e
  {
Packit 1c1d7e
    docs+=SA("
");
Packit 1c1d7e
    if (child.hasAttribute(SA("altdefval")))
Packit 1c1d7e
    {
Packit 1c1d7e
      docs+=SA(" The default value is: system dependent.");
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      QString defval = child.attribute(SA("defval"));
Packit 1c1d7e
      docs+=SA(" The default value is: ")+
Packit 1c1d7e
            (defval==SA("1")?SA("YES"):SA("NO"))+
Packit 1c1d7e
            SA(".");
Packit 1c1d7e
    }
Packit 1c1d7e
    docs+= SA("
");
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (type==SA("list"))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (child.attribute(SA("format"))==SA("string"))
Packit 1c1d7e
    {
Packit 1c1d7e
      int numValues = 0;
Packit 1c1d7e
      docsVal = child.firstChildElement();
Packit 1c1d7e
      while (!docsVal.isNull())
Packit 1c1d7e
      {
Packit 1c1d7e
        if (docsVal.tagName()==SA("value"))
Packit 1c1d7e
        {
Packit 1c1d7e
          QString showDocu = SA("");
Packit 1c1d7e
          if (docsVal.hasAttribute(SA("show_docu")))
Packit 1c1d7e
          {
Packit 1c1d7e
            showDocu = docsVal.attribute(SA("show_docu")).toLower();
Packit 1c1d7e
          }
Packit 1c1d7e
          if ((showDocu != SA("no")) && (docsVal.attribute(SA("name"))!=SA(""))) numValues++;
Packit 1c1d7e
        }
Packit 1c1d7e
        docsVal = docsVal.nextSiblingElement();
Packit 1c1d7e
      }
Packit 1c1d7e
      if (numValues>0)
Packit 1c1d7e
      {
Packit 1c1d7e
        int i = 0;
Packit 1c1d7e
        docsVal = child.firstChildElement();
Packit 1c1d7e
        while (!docsVal.isNull())
Packit 1c1d7e
        {
Packit 1c1d7e
          if (docsVal.tagName()==SA("value"))
Packit 1c1d7e
          {
Packit 1c1d7e
            QString showDocu = SA("");
Packit 1c1d7e
            if (docsVal.hasAttribute(SA("show_docu")))
Packit 1c1d7e
            {
Packit 1c1d7e
              showDocu = docsVal.attribute(SA("show_docu")).toLower();
Packit 1c1d7e
            }
Packit 1c1d7e
            if ((showDocu != SA("no")) && (docsVal.attribute(SA("name"))!=SA("")))
Packit 1c1d7e
            {
Packit 1c1d7e
              i++;
Packit 1c1d7e
              docs += SA("") + docsVal.attribute(SA("name")) + SA("");
Packit 1c1d7e
              QString desc = docsVal.attribute(SA("desc"));
Packit 1c1d7e
              if (desc != SA(""))
Packit 1c1d7e
              {
Packit 1c1d7e
                docs += SA(" ") + desc;
Packit 1c1d7e
              }
Packit 1c1d7e
              if (i==numValues-1)
Packit 1c1d7e
              {
Packit 1c1d7e
                docs += SA(" and ");
Packit 1c1d7e
              }
Packit 1c1d7e
              else if (i==numValues)
Packit 1c1d7e
              {
Packit 1c1d7e
                docs += SA(".");
Packit 1c1d7e
              }
Packit 1c1d7e
              else
Packit 1c1d7e
              {
Packit 1c1d7e
                docs += SA(", ");
Packit 1c1d7e
              }
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
          docsVal = docsVal.nextSiblingElement();
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      // docs+= SA("
");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (type==SA("string"))
Packit 1c1d7e
  {
Packit 1c1d7e
    QString defval = child.attribute(SA("defval"));
Packit 1c1d7e
    if (child.attribute(SA("format")) == SA("dir"))
Packit 1c1d7e
    {
Packit 1c1d7e
      if (defval != SA(""))
Packit 1c1d7e
      {
Packit 1c1d7e
        docs+=SA("
");
Packit 1c1d7e
        docs += SA(" The default directory is: ") + defval + SA(".");
Packit 1c1d7e
        docs += SA("
");
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (child.attribute(SA("format")) == SA("file"))
Packit 1c1d7e
    {
Packit 1c1d7e
      QString abspath = child.attribute(SA("abspath"));
Packit 1c1d7e
      if (defval != SA(""))
Packit 1c1d7e
      {
Packit 1c1d7e
        docs+=SA("
");
Packit 1c1d7e
        if (abspath != SA("1"))
Packit 1c1d7e
        {
Packit 1c1d7e
          docs += SA(" The default file is: ") + defval + SA(".");
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          docs += SA(" The default file (with absolute path) is: ") + defval + SA(".");
Packit 1c1d7e
        }
Packit 1c1d7e
        docs += SA("
");
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        if (abspath == SA("1"))
Packit 1c1d7e
        {
Packit 1c1d7e
          docs+=SA("
");
Packit 1c1d7e
          docs += SA(" The file has to be specified with full path.");
Packit 1c1d7e
          docs += SA("
");
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (child.attribute(SA("format")) == SA("image"))
Packit 1c1d7e
    {
Packit 1c1d7e
      QString abspath = child.attribute(SA("abspath"));
Packit 1c1d7e
      if (defval != SA(""))
Packit 1c1d7e
      {
Packit 1c1d7e
        docs+=SA("
");
Packit 1c1d7e
        if (abspath != SA("1"))
Packit 1c1d7e
        {
Packit 1c1d7e
          docs += SA(" The default image is: ") + defval + SA(".");
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          docs += SA(" The default image (with absolute path) is: ") + defval + SA(".");
Packit 1c1d7e
        }
Packit 1c1d7e
        docs += SA("
");
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        if (abspath == SA("1"))
Packit 1c1d7e
        {
Packit 1c1d7e
          docs+=SA("
");
Packit 1c1d7e
          docs += SA(" The image has to be specified with full path.");
Packit 1c1d7e
          docs += SA("
");
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else // if (child.attribute(SA("format")) == SA("string"))
Packit 1c1d7e
    {
Packit 1c1d7e
      if (defval != SA(""))
Packit 1c1d7e
      {
Packit 1c1d7e
        docs+=SA("
");
Packit 1c1d7e
        docs += SA(" The default value is: ") + defval + SA(".");
Packit 1c1d7e
        docs += SA("
");
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  if (child.hasAttribute(SA("depends")))
Packit 1c1d7e
  {
Packit 1c1d7e
    QString dependsOn = child.attribute(SA("depends"));
Packit 1c1d7e
    docs+=SA("
");
Packit 1c1d7e
    docs+=  SA(" This tag requires that the tag \\ref cfg_");
Packit 1c1d7e
    docs+=  dependsOn.toLower();
Packit 1c1d7e
    docs+=  SA(" \"");
Packit 1c1d7e
    docs+=  dependsOn.toUpper();
Packit 1c1d7e
    docs+=  SA("\" is set to YES.");
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // Remove / replace doxygen markup strings
Packit 1c1d7e
  // the regular expressions are hard to read so the intention will be given
Packit 1c1d7e
  QRegExp regexp;
Packit 1c1d7e
  // remove \n at end and replace by a space
Packit 1c1d7e
  regexp.setPattern(SA("\\n$"));
Packit 1c1d7e
  docs.replace(regexp,SA(" "));
Packit 1c1d7e
  // remove 
at end
Packit 1c1d7e
  regexp.setPattern(SA("
*$"));
Packit 1c1d7e
  docs.replace(regexp,SA(" "));
Packit 1c1d7e
  // \c word -> word; word ends with ')', ',', '.' or ' '
Packit 1c1d7e
  regexp.setPattern(SA("\\\\c[ ]+([^ \\)]+)\\)"));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1)"));
Packit 1c1d7e
Packit 1c1d7e
  regexp.setPattern(SA("\\\\c[ ]+([^ ,]+),"));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1,"));
Packit 1c1d7e
Packit 1c1d7e
  regexp.setPattern(SA("\\\\c[ ]+([^ \\.]+)\\."));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1."));
Packit 1c1d7e
Packit 1c1d7e
  regexp.setPattern(SA("\\\\c[ ]+([^ ]+) "));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1 "));
Packit 1c1d7e
  // `word` -> word
Packit 1c1d7e
  docs.replace(SA("``"),SA(""));
Packit 1c1d7e
  regexp.setPattern(SA("`([^`]+)`"));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1"));
Packit 1c1d7e
  // \ref key "desc" -> desc
Packit 1c1d7e
  regexp.setPattern(SA("\\\\ref[ ]+[^ ]+[ ]+\"([^ ]+)\""));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1 "));
Packit 1c1d7e
  //\ref specials
Packit 1c1d7e
  // \ref <key> -> description
Packit 1c1d7e
  regexp.setPattern(SA("\\\\ref[ ]+doxygen_usage"));
Packit 1c1d7e
  docs.replace(regexp,SA("\"Doxygen usage\""));
Packit 1c1d7e
  regexp.setPattern(SA("\\\\ref[ ]+extsearch"));
Packit 1c1d7e
  docs.replace(regexp,SA("\"External Indexing and Searching\""));
Packit 1c1d7e
  regexp.setPattern(SA("\\\\ref[ ]+external"));
Packit 1c1d7e
  docs.replace(regexp,SA("\"Linking to external documentation\""));
Packit 1c1d7e
  // fallback for not handled
Packit 1c1d7e
  docs.replace(SA("\\\\ref"),SA(""));
Packit 1c1d7e
  // \b word -> word<\b>
Packit 1c1d7e
  regexp.setPattern(SA("\\\\b[ ]+([^ ]+) "));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1 "));
Packit 1c1d7e
  // \e word -> word<\em>
Packit 1c1d7e
  regexp.setPattern(SA("\\\\e[ ]+([^ ]+) "));
Packit 1c1d7e
  docs.replace(regexp,SA("\\1 "));
Packit 1c1d7e
  // \note -> 
Note:
Packit 1c1d7e
  // @note -> 
Note:
Packit 1c1d7e
  docs.replace(SA("\\note"),SA("
Note:"));
Packit 1c1d7e
  docs.replace(SA("@note"),SA("
Note:"));
Packit 1c1d7e
  // \#include -> #include
Packit 1c1d7e
  // \#undef -> #undef
Packit 1c1d7e
  docs.replace(SA("\\#include"),SA("#include"));
Packit 1c1d7e
  docs.replace(SA("\\#undef"),SA("#undef"));
Packit 1c1d7e
  // -# -> 
-
Packit 1c1d7e
  // " - " -> 
-
Packit 1c1d7e
  docs.replace(SA("-#"),SA("
-"));
Packit 1c1d7e
  docs.replace(SA(" - "),SA("
-"));
Packit 1c1d7e
  // \verbatim -> 
Packit 1c1d7e
  // \endverbatim -> 
Packit 1c1d7e
  docs.replace(SA("\\verbatim"),SA("
"));
Packit 1c1d7e
  docs.replace(SA("\\endverbatim"),SA(""));
Packit 1c1d7e
  // \sa -> 
See also:
Packit 1c1d7e
  // \par -> 
Packit 1c1d7e
  docs.replace(SA("\\sa"),SA("
See also:"));
Packit 1c1d7e
  docs.replace(SA("\\par"),SA("
"));
Packit 1c1d7e
  // 2xbackslash -> backslash
Packit 1c1d7e
  // \@ -> @
Packit 1c1d7e
  docs.replace(SA("\\\\"),SA("\\"));
Packit 1c1d7e
  docs.replace(SA("\\@"),SA("@"));
Packit 1c1d7e
  // \& -> &
Packit 1c1d7e
  // \$ -> $
Packit 1c1d7e
  docs.replace(SA("\\&"),SA("&"));
Packit 1c1d7e
  docs.replace(SA("\\$"),SA("$"));
Packit 1c1d7e
  // \< -> <
Packit 1c1d7e
  // \> -> >
Packit 1c1d7e
  docs.replace(SA("\\<"),SA("<"));
Packit 1c1d7e
  docs.replace(SA("\\>"),SA(">"));
Packit 1c1d7e
  regexp.setPattern(SA(" (http:[^ \\)]*)([ \\)])"));
Packit 1c1d7e
  docs.replace(regexp,SA(" \\1\\2"));
Packit 1c1d7e
  // LaTeX name as formula -> LaTeX
Packit 1c1d7e
  regexp.setPattern(SA("\\\\f\\$\\\\mbox\\{\\\\LaTeX\\}\\\\f\\$"));
Packit 1c1d7e
  docs.replace(regexp,SA("LaTeX"));
Packit 1c1d7e
  // Other formula's (now just 2) so explicitly mentioned.
Packit 1c1d7e
  regexp.setPattern(SA("\\\\f\\$2\\^\\{\\(16\\+\\\\mbox\\{LOOKUP\\\\_CACHE\\\\_SIZE\\}\\)\\}\\\\f\\$"));
Packit 1c1d7e
  docs.replace(regexp,SA("2^(16+LOOKUP_CACHE_SIZE)"));
Packit 1c1d7e
  regexp.setPattern(SA("\\\\f\\$2\\^\\{16\\} = 65536\\\\f\\$"));
Packit 1c1d7e
  docs.replace(regexp,SA("2^16=65536"));
Packit 1c1d7e
Packit 1c1d7e
  return docs.trimmed();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QWidget *Expert::createTopicWidget(QDomElement &elem)
Packit 1c1d7e
{
Packit 1c1d7e
  QScrollArea *area   = new QScrollArea;
Packit 1c1d7e
  QWidget     *topic  = new QWidget;
Packit 1c1d7e
  QGridLayout *layout = new QGridLayout(topic);
Packit 1c1d7e
  QDomElement child   = elem.firstChildElement();
Packit 1c1d7e
  int row=0;
Packit 1c1d7e
  while (!child.isNull())
Packit 1c1d7e
  {
Packit 1c1d7e
    QString setting = child.attribute(SA("setting"));
Packit 1c1d7e
    if (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1()))
Packit 1c1d7e
    {
Packit 1c1d7e
      QString type = child.attribute(SA("type"));
Packit 1c1d7e
      QString docs = getDocsForNode(child);
Packit 1c1d7e
      if (type==SA("bool"))
Packit 1c1d7e
      {
Packit 1c1d7e
        InputBool *boolOption = 
Packit 1c1d7e
          new InputBool(
Packit 1c1d7e
              layout,row,
Packit 1c1d7e
              child.attribute(SA("id")),
Packit 1c1d7e
              child.attribute(SA("defval"))==SA("1"),
Packit 1c1d7e
              docs
Packit 1c1d7e
              );
Packit 1c1d7e
        m_options.insert(
Packit 1c1d7e
            child.attribute(SA("id")),
Packit 1c1d7e
            boolOption
Packit 1c1d7e
            );
Packit 1c1d7e
        connect(boolOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
Packit 1c1d7e
        connect(boolOption,SIGNAL(changed()),SIGNAL(changed()));
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (type==SA("string"))
Packit 1c1d7e
      {
Packit 1c1d7e
        InputString::StringMode mode;
Packit 1c1d7e
        QString format = child.attribute(SA("format"));
Packit 1c1d7e
        if (format==SA("dir"))
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputString::StringDir;
Packit 1c1d7e
        }
Packit 1c1d7e
        else if (format==SA("file"))
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputString::StringFile;
Packit 1c1d7e
        }
Packit 1c1d7e
        else if (format==SA("image"))
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputString::StringImage;
Packit 1c1d7e
        }
Packit 1c1d7e
        else // format=="string"
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputString::StringFree;
Packit 1c1d7e
        }
Packit 1c1d7e
        InputString *stringOption = 
Packit 1c1d7e
          new InputString(
Packit 1c1d7e
              layout,row,
Packit 1c1d7e
              child.attribute(SA("id")),
Packit 1c1d7e
              child.attribute(SA("defval")),
Packit 1c1d7e
              mode,
Packit 1c1d7e
              docs,
Packit 1c1d7e
              child.attribute(SA("abspath"))
Packit 1c1d7e
              );
Packit 1c1d7e
        m_options.insert(
Packit 1c1d7e
            child.attribute(SA("id")),
Packit 1c1d7e
            stringOption
Packit 1c1d7e
            );
Packit 1c1d7e
        connect(stringOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
Packit 1c1d7e
        connect(stringOption,SIGNAL(changed()),SIGNAL(changed()));
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (type==SA("enum"))
Packit 1c1d7e
      {
Packit 1c1d7e
        InputString *enumList = new InputString(
Packit 1c1d7e
            layout,row,
Packit 1c1d7e
            child.attribute(SA("id")),
Packit 1c1d7e
            child.attribute(SA("defval")),
Packit 1c1d7e
            InputString::StringFixed,
Packit 1c1d7e
            docs
Packit 1c1d7e
            );
Packit 1c1d7e
        QDomElement enumVal = child.firstChildElement();
Packit 1c1d7e
        while (!enumVal.isNull())
Packit 1c1d7e
        {
Packit 1c1d7e
          if (enumVal.tagName()==SA("value"))
Packit 1c1d7e
          {
Packit 1c1d7e
            enumList->addValue(enumVal.attribute(SA("name")));
Packit 1c1d7e
          }
Packit 1c1d7e
          enumVal = enumVal.nextSiblingElement();
Packit 1c1d7e
        }
Packit 1c1d7e
        enumList->setDefault();
Packit 1c1d7e
Packit 1c1d7e
        m_options.insert(child.attribute(SA("id")),enumList);
Packit 1c1d7e
        connect(enumList,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
Packit 1c1d7e
        connect(enumList,SIGNAL(changed()),SIGNAL(changed()));
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (type==SA("int"))
Packit 1c1d7e
      {
Packit 1c1d7e
        InputInt *intOption = 
Packit 1c1d7e
          new InputInt(
Packit 1c1d7e
              layout,row,
Packit 1c1d7e
              child.attribute(SA("id")),
Packit 1c1d7e
              child.attribute(SA("defval")).toInt(),
Packit 1c1d7e
              child.attribute(SA("minval")).toInt(),
Packit 1c1d7e
              child.attribute(SA("maxval")).toInt(),
Packit 1c1d7e
              docs
Packit 1c1d7e
              );
Packit 1c1d7e
        m_options.insert(
Packit 1c1d7e
            child.attribute(SA("id")),
Packit 1c1d7e
            intOption
Packit 1c1d7e
            );
Packit 1c1d7e
        connect(intOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
Packit 1c1d7e
        connect(intOption,SIGNAL(changed()),SIGNAL(changed()));
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (type==SA("list"))
Packit 1c1d7e
      {
Packit 1c1d7e
        InputStrList::ListMode mode;
Packit 1c1d7e
        QString format = child.attribute(SA("format"));
Packit 1c1d7e
        if (format==SA("dir"))
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputStrList::ListDir;
Packit 1c1d7e
        }
Packit 1c1d7e
        else if (format==SA("file"))
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputStrList::ListFile;
Packit 1c1d7e
        }
Packit 1c1d7e
        else if (format==SA("filedir"))
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputStrList::ListFileDir;
Packit 1c1d7e
        }
Packit 1c1d7e
        else // format=="string"
Packit 1c1d7e
        {
Packit 1c1d7e
          mode = InputStrList::ListString;
Packit 1c1d7e
        }
Packit 1c1d7e
        QStringList sl;
Packit 1c1d7e
        QDomElement listVal = child.firstChildElement();
Packit 1c1d7e
        while (!listVal.isNull())
Packit 1c1d7e
        {
Packit 1c1d7e
          if (listVal.tagName()==SA("value"))
Packit 1c1d7e
          {
Packit 1c1d7e
            sl.append(listVal.attribute(SA("name")));
Packit 1c1d7e
          }
Packit 1c1d7e
          listVal = listVal.nextSiblingElement();
Packit 1c1d7e
        }
Packit 1c1d7e
        InputStrList *listOption = 
Packit 1c1d7e
          new InputStrList(
Packit 1c1d7e
              layout,row,
Packit 1c1d7e
              child.attribute(SA("id")),
Packit 1c1d7e
              sl,
Packit 1c1d7e
              mode,
Packit 1c1d7e
              docs
Packit 1c1d7e
              );
Packit 1c1d7e
        m_options.insert(
Packit 1c1d7e
            child.attribute(SA("id")),
Packit 1c1d7e
            listOption
Packit 1c1d7e
            );
Packit 1c1d7e
        connect(listOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
Packit 1c1d7e
        connect(listOption,SIGNAL(changed()),SIGNAL(changed()));
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (type==SA("obsolete"))
Packit 1c1d7e
      {
Packit 1c1d7e
        // ignore
Packit 1c1d7e
      }
Packit 1c1d7e
      else // should not happen
Packit 1c1d7e
      {
Packit 1c1d7e
        printf("Unsupported type %s\n",qPrintable(child.attribute(SA("type"))));
Packit 1c1d7e
      }
Packit 1c1d7e
    } // IS_SUPPORTED
Packit 1c1d7e
    child = child.nextSiblingElement();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // compute dependencies between options
Packit 1c1d7e
  child = elem.firstChildElement();
Packit 1c1d7e
  while (!child.isNull())
Packit 1c1d7e
  {
Packit 1c1d7e
    QString setting = child.attribute(SA("setting"));
Packit 1c1d7e
    QString dependsOn = child.attribute(SA("depends"));
Packit 1c1d7e
    QString id        = child.attribute(SA("id"));
Packit 1c1d7e
    if (!dependsOn.isEmpty() && 
Packit 1c1d7e
        (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1())))
Packit 1c1d7e
    {
Packit 1c1d7e
       Input *parentOption = m_options[dependsOn];
Packit 1c1d7e
       if (parentOption==0)
Packit 1c1d7e
       {
Packit 1c1d7e
         printf("%s has depends=%s that is not valid\n",
Packit 1c1d7e
             qPrintable(id),qPrintable(dependsOn));
Packit 1c1d7e
       }
Packit 1c1d7e
       Input *thisOption   = m_options[id];
Packit 1c1d7e
       Q_ASSERT(parentOption);
Packit 1c1d7e
       Q_ASSERT(thisOption);
Packit 1c1d7e
       if (parentOption && thisOption)
Packit 1c1d7e
       {
Packit 1c1d7e
         //printf("Adding dependency '%s' (%p)->'%s' (%p)\n",
Packit 1c1d7e
         //  qPrintable(dependsOn),parentOption,
Packit 1c1d7e
         //  qPrintable(id),thisOption);
Packit 1c1d7e
         parentOption->addDependency(thisOption);
Packit 1c1d7e
       }
Packit 1c1d7e
    }
Packit 1c1d7e
    child = child.nextSiblingElement();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // set initial dependencies
Packit 1c1d7e
  QHashIterator<QString,Input*> i(m_options);
Packit 1c1d7e
  while (i.hasNext()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    i.next();
Packit 1c1d7e
    if (i.value())
Packit 1c1d7e
    {
Packit 1c1d7e
      i.value()->updateDependencies();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  layout->setRowStretch(row,1);
Packit 1c1d7e
  layout->setColumnStretch(1,2);
Packit 1c1d7e
  layout->setSpacing(5);
Packit 1c1d7e
  topic->setLayout(layout);
Packit 1c1d7e
  area->setWidget(topic);
Packit 1c1d7e
  area->setWidgetResizable(true);
Packit 1c1d7e
  return area;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *)
Packit 1c1d7e
{
Packit 1c1d7e
  if (item)
Packit 1c1d7e
  {
Packit 1c1d7e
    QWidget *w = m_topics[item->text(0)];
Packit 1c1d7e
    m_topicStack->setCurrentWidget(w);
Packit 1c1d7e
    m_prev->setEnabled(m_topicStack->currentIndex()!=0); 
Packit 1c1d7e
    m_next->setEnabled(true);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::loadSettings(QSettings *s)
Packit 1c1d7e
{
Packit 1c1d7e
  QHashIterator<QString,Input*> i(m_options);
Packit 1c1d7e
  while (i.hasNext()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    i.next();
Packit 1c1d7e
    QVariant var = s->value(SA("config/")+i.key());
Packit 1c1d7e
    if (i.value())
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("Loading key %s: type=%d value='%s'\n",qPrintable(i.key()),var.type(),qPrintable(var.toString()));
Packit 1c1d7e
      i.value()->value() = var;
Packit 1c1d7e
      i.value()->update();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::saveSettings(QSettings *s)
Packit 1c1d7e
{
Packit 1c1d7e
  QHashIterator<QString,Input*> i(m_options);
Packit 1c1d7e
  while (i.hasNext()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    i.next();
Packit 1c1d7e
    //printf("Saving key %s: type=%d value='%s'\n",qPrintable(i.key()),i.value()->value().type(),qPrintable(i.value()->value().toString()));
Packit 1c1d7e
    if (i.value())
Packit 1c1d7e
    {
Packit 1c1d7e
      s->setValue(SA("config/")+i.key(),i.value()->value());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::loadConfig(const QString &fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("Expert::loadConfig(%s)\n",qPrintable(fileName));
Packit 1c1d7e
  parseConfig(fileName,m_options);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,
Packit 1c1d7e
                       bool brief)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!brief)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "#---------------------------------------------------------------------------" << endl;
Packit 1c1d7e
  t << "# " << elem.attribute(SA("docs")) << endl;
Packit 1c1d7e
  t << "#---------------------------------------------------------------------------" << endl;
Packit 1c1d7e
  // write options...
Packit 1c1d7e
  QDomElement childElem = elem.firstChildElement();
Packit 1c1d7e
  while (!childElem.isNull())
Packit 1c1d7e
  {
Packit 1c1d7e
    QString setting = childElem.attribute(SA("setting"));
Packit 1c1d7e
    QString type = childElem.attribute(SA("type"));
Packit 1c1d7e
    QString name = childElem.attribute(SA("id"));
Packit 1c1d7e
    if (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1()))
Packit 1c1d7e
    {
Packit 1c1d7e
      QHash<QString,Input*>::const_iterator i = m_options.find(name);
Packit 1c1d7e
      if (i!=m_options.end())
Packit 1c1d7e
      {
Packit 1c1d7e
        Input *option = i.value();
Packit 1c1d7e
        if (option && !brief)
Packit 1c1d7e
        {
Packit 1c1d7e
          t << endl;
Packit 1c1d7e
          t << convertToComment(option->templateDocs());
Packit 1c1d7e
          t << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << name.leftJustified(MAX_OPTION_LENGTH) << "= ";
Packit 1c1d7e
        if (option)
Packit 1c1d7e
        {
Packit 1c1d7e
          option->writeValue(t,codec);
Packit 1c1d7e
        }
Packit 1c1d7e
        t << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    childElem = childElem.nextSiblingElement();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool Expert::writeConfig(QTextStream &t,bool brief)
Packit 1c1d7e
{
Packit 1c1d7e
  // write global header
Packit 1c1d7e
  t << "# Doxyfile " << versionString << endl << endl; 
Packit 1c1d7e
  if (!brief)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << convertToComment(m_header);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QTextCodec *codec = 0;
Packit 1c1d7e
  Input *option = m_options[QString::fromLatin1("DOXYFILE_ENCODING")];
Packit 1c1d7e
  if (option)
Packit 1c1d7e
  {
Packit 1c1d7e
    codec = QTextCodec::codecForName(option->value().toString().toLatin1());
Packit 1c1d7e
    if (codec==0) // fallback: use UTF-8
Packit 1c1d7e
    {
Packit 1c1d7e
      codec = QTextCodec::codecForName("UTF-8");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  QDomElement childElem = m_rootElement.firstChildElement();
Packit 1c1d7e
  while (!childElem.isNull())
Packit 1c1d7e
  {
Packit 1c1d7e
    if (childElem.tagName()==SA("group"))
Packit 1c1d7e
    {
Packit 1c1d7e
      saveTopic(t,childElem,codec,brief);
Packit 1c1d7e
    }
Packit 1c1d7e
    childElem = childElem.nextSiblingElement();
Packit 1c1d7e
  }
Packit 1c1d7e
  return true;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QByteArray Expert::saveInnerState () const
Packit 1c1d7e
{
Packit 1c1d7e
  return m_splitter->saveState();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool Expert::restoreInnerState ( const QByteArray & state )
Packit 1c1d7e
{
Packit 1c1d7e
  return m_splitter->restoreState(state);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::showHelp(Input *option)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!m_inShowHelp)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_inShowHelp = true;
Packit 1c1d7e
    m_helper->setText(
Packit 1c1d7e
        QString::fromLatin1("<qt>")+option->id()+
Packit 1c1d7e
        QString::fromLatin1("
")+
Packit 1c1d7e
        QString::fromLatin1("
")+
Packit 1c1d7e
        option->docs().
Packit 1c1d7e
        replace(QChar::fromLatin1('\n'),QChar::fromLatin1(' '))+
Packit 1c1d7e
        QString::fromLatin1("</qt>")
Packit 1c1d7e
        );
Packit 1c1d7e
    m_inShowHelp = false;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::nextTopic()
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_topicStack->currentIndex()+1==m_topicStack->count()) // last topic
Packit 1c1d7e
  {
Packit 1c1d7e
    done();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1);
Packit 1c1d7e
    m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
Packit 1c1d7e
    m_prev->setEnabled(m_topicStack->currentIndex()!=0);
Packit 1c1d7e
    m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::prevTopic()
Packit 1c1d7e
{
Packit 1c1d7e
  m_topicStack->setCurrentIndex(m_topicStack->currentIndex()-1);
Packit 1c1d7e
  m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
Packit 1c1d7e
  m_prev->setEnabled(m_topicStack->currentIndex()!=0);
Packit 1c1d7e
  m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::resetToDefaults()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("Expert::makeDefaults()\n");
Packit 1c1d7e
  QHashIterator<QString,Input*> i(m_options);
Packit 1c1d7e
  while (i.hasNext()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    i.next();
Packit 1c1d7e
    if (i.value())
Packit 1c1d7e
    {
Packit 1c1d7e
      i.value()->reset();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool stringVariantToBool(const QVariant &v)
Packit 1c1d7e
{
Packit 1c1d7e
  QString s = v.toString().toLower();
Packit 1c1d7e
  return s==QString::fromLatin1("yes") || s==QString::fromLatin1("true") || s==QString::fromLatin1("1");
Packit 1c1d7e
} 
Packit 1c1d7e
Packit 1c1d7e
static bool getBoolOption(
Packit 1c1d7e
    const QHash<QString,Input*>&model,const QString &name)
Packit 1c1d7e
{
Packit 1c1d7e
  Input *option = model[name];
Packit 1c1d7e
  Q_ASSERT(option!=0);
Packit 1c1d7e
  return stringVariantToBool(option->value());
Packit 1c1d7e
} 
Packit 1c1d7e
Packit 1c1d7e
static QString getStringOption(
Packit 1c1d7e
    const QHash<QString,Input*>&model,const QString &name)
Packit 1c1d7e
{
Packit 1c1d7e
  Input *option = model[name];
Packit 1c1d7e
  Q_ASSERT(option!=0);
Packit 1c1d7e
  return option->value().toString();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
bool Expert::htmlOutputPresent(const QString &workingDir) const
Packit 1c1d7e
{
Packit 1c1d7e
  bool generateHtml = getBoolOption(m_options,QString::fromLatin1("GENERATE_HTML"));
Packit 1c1d7e
  if (!generateHtml || workingDir.isEmpty()) return false;
Packit 1c1d7e
  QString indexFile = getHtmlOutputIndex(workingDir);
Packit 1c1d7e
  QFileInfo fi(indexFile);
Packit 1c1d7e
  return fi.exists() && fi.isFile();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QString Expert::getHtmlOutputIndex(const QString &workingDir) const
Packit 1c1d7e
{
Packit 1c1d7e
  QString outputDir = getStringOption(m_options,QString::fromLatin1("OUTPUT_DIRECTORY"));
Packit 1c1d7e
  QString htmlOutputDir = getStringOption(m_options,QString::fromLatin1("HTML_OUTPUT"));
Packit 1c1d7e
  //printf("outputDir=%s\n",qPrintable(outputDir));
Packit 1c1d7e
  //printf("htmlOutputDir=%s\n",qPrintable(htmlOutputDir));
Packit 1c1d7e
  QString indexFile = workingDir;
Packit 1c1d7e
  if (QFileInfo(outputDir).isAbsolute()) // override
Packit 1c1d7e
  {
Packit 1c1d7e
    indexFile = outputDir;
Packit 1c1d7e
  }
Packit 1c1d7e
  else // append
Packit 1c1d7e
  { 
Packit 1c1d7e
    indexFile += QString::fromLatin1("/")+outputDir;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (QFileInfo(htmlOutputDir).isAbsolute()) // override
Packit 1c1d7e
  {
Packit 1c1d7e
    indexFile = htmlOutputDir;
Packit 1c1d7e
  }
Packit 1c1d7e
  else // append
Packit 1c1d7e
  {
Packit 1c1d7e
    indexFile += QString::fromLatin1("/")+htmlOutputDir;
Packit 1c1d7e
  }
Packit 1c1d7e
  indexFile+=QString::fromLatin1("/index.html");
Packit 1c1d7e
  return indexFile;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool Expert::pdfOutputPresent(const QString &workingDir) const
Packit 1c1d7e
{
Packit 1c1d7e
  bool generateLatex = getBoolOption(m_options,QString::fromLatin1("GENERATE_LATEX"));
Packit 1c1d7e
  bool pdfLatex = getBoolOption(m_options,QString::fromLatin1("USE_PDFLATEX"));
Packit 1c1d7e
  if (!generateLatex || !pdfLatex) return false;
Packit 1c1d7e
  QString latexOutput = getStringOption(m_options,QString::fromLatin1("LATEX_OUTPUT"));
Packit 1c1d7e
  QString indexFile;
Packit 1c1d7e
  if (QFileInfo(latexOutput).isAbsolute())
Packit 1c1d7e
  {
Packit 1c1d7e
    indexFile = latexOutput+QString::fromLatin1("/refman.pdf");
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    indexFile = workingDir+QString::fromLatin1("/")+
Packit 1c1d7e
                latexOutput+QString::fromLatin1("/refman.pdf");
Packit 1c1d7e
  }
Packit 1c1d7e
  QFileInfo fi(indexFile);
Packit 1c1d7e
  return fi.exists() && fi.isFile();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Expert::refresh()
Packit 1c1d7e
{
Packit 1c1d7e
  m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(0));
Packit 1c1d7e
}
Packit 1c1d7e