/* This file was generated by configgen on Sun Aug 13 11:17:41 2000
 * from doxywizard_templ.cpp
 *
 * DO NOT EDIT!
 */

/******************************************************************************
 *
 * $Id: doxywizard_templ.cpp,v 1.3 2000/05/28 19:28:27 root Exp $
 *
 * Copyright (C) 2000 by Dimitri van Heesch.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <qmainwindow.h>
#include <qpopupmenu.h>
#include <qfileinfo.h>
#include <qmenubar.h>
#include <qstatusbar.h>
#include <qfiledialog.h>
#include <qmessagebox.h>
#include <qapplication.h>
#include <qwhatsthis.h>
#include <qlayout.h>
#include <qtabwidget.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>

#include "doxywizard.h"
#include "pagewidget.h"
#include "inputbool.h"
#include "inputstring.h"
#include "inputstrlist.h"
#include "inputint.h"
#include "config.h"
#include "version.h"
#include "pixmaps.h"

QString configFileName;

const int messageTimeout = 4000; //!< status bar message timeout in millisec.

//-------------------------------------------------------------------------

static bool loadConfig( QString loadFile )
{
  QFileInfo fi( loadFile );
  if ( !fi.exists() )
  {
    QMessageBox::warning(0,
                         "Warning","Input file "+loadFile+
                         " does not exist! Starting new file.",
                         "ok"
                        );
    return FALSE;
  }
  QFile f( loadFile );
  if ( !f.open(IO_ReadOnly) )
  {
    QMessageBox::warning(0,
                         "Warning","Cannot open input "+loadFile+
                         " for reading!.",
                         "abort"
                        );
    exit(1);
  }

  // set config values to their defaults
  Config::init();

  // read file into a string buffer
  int fsize = fi.size();
  QCString contents(fsize+1); // add room for \0 terminator
  f.readBlock(contents.data(),fsize);
  contents[fsize]='\0';

  // parse the config file
  // this will initialize the various Config data members
  parseConfig(contents,loadFile);
  configStrToVal();

  f.close();
  return TRUE;
}

static bool saveConfig( QString saveFile )
{
  QFile f( saveFile );
  if ( !f.open(IO_WriteOnly) ) 
  {   
    QMessageBox::warning(0,
                         "Warning","Cannot open file "+saveFile+
                         " for writing. Nothing saved!.",
                         "ok"
                        );
    return FALSE; // failure
  }

  writeTemplateConfig(&f,TRUE); // write brief config file

  return TRUE; // success
}

//--------------------------------------------------------------------------

Wizard::Wizard(int argc,char **argv) : 
    QMainWindow( 0, (QCString)"DoxyWizard v"+versionString )
{
  // File popupmenu

  hasChanged=FALSE;
   
  fileTools = new QToolBar( this, "file operations" );
  fileTools->setLabel( "File Operations" );

       new QToolButton( QPixmap( file_xpm ), "New File", QString::null,
                        this, SLOT(newFile()), fileTools, "new file" );

  //QToolButton * fileOpen = 
       new QToolButton( QPixmap( fileopen_xpm ), "Open File", QString::null,
                        this, SLOT(loadFile()), fileTools, "open file" );

  //QToolButton * fileSave = 
       new QToolButton( QPixmap( filesave_xpm ), "Save File", QString::null,
                        this, SLOT(saveFile()), fileTools, "save file" );


  QWhatsThis::whatsThisButton( fileTools );     
  
  QPopupMenu* file = new QPopupMenu;
  file->insertItem( QIconSet(QPixmap(file_xpm)), 
                    "&New",  this, SLOT(newFile()),  CTRL+Key_N );
  file->insertItem( QIconSet(QPixmap(fileopen_xpm)),
                    "&Load", this, SLOT(loadFile()), CTRL+Key_O );
  file->insertSeparator();
  file->insertItem( QIconSet(QPixmap(filesave_xpm)),
                    "&Save", this, SLOT(saveFile()), CTRL+Key_S );
  file->insertItem( "&Save as ...", this, SLOT(saveAsFile()) );
  file->insertSeparator();
  file->insertItem( "&Quit", this, SLOT(quit()),     CTRL+Key_Q );

  // Doxygen popupmenu
  //QPopupMenu* doxygen = new QPopupMenu;
  //int itemIndex = doxygen->insertItem( "&Run" );
  //doxygen->setWhatsThis ( itemIndex, "Run doxygen with the current configuration file..." );
  //doxygen->setItemEnabled( itemIndex, FALSE );

  // Help popupmenu
  QPopupMenu* help = new QPopupMenu;
  help->insertItem( "&About", this, SLOT(about()), Key_F1 );
  help->insertItem( "What's &This", this , SLOT(whatsThis()), SHIFT+Key_F1);

  // menubar definition
  menuBar()->insertItem( "&File", file );
  //menuBar()->insertItem( "&Doxygen", doxygen );
  menuBar()->insertSeparator();
  menuBar()->insertItem( "&Help", help ); 

  statusBar()->message("Welcome to DoxyWizard",messageTimeout);

  cw = new ConfigFile( this );
  connect(cw,SIGNAL(changed()),this,SLOT(changed()));
  setCentralWidget( cw );
  cw->show();

  if (argc==2)
  {
    loadFile(argv[1]);
  }
  else
  {
    newFile();
  }
  refreshCaption();
  
  resize( 640, 480 );

}

void Wizard::newFile()
{
  if (hasChanged)
  {
    switch( QMessageBox::warning( this, "DoxyWizard", "Start a new file and lose changes?\n",
            "Yes", "No", 0, 0, 1 ))
    {
      case 0: 
        break;
      default: // command aborted by the user 
        return;
    }
  }
  Config::init();
  configFileName="Doxyfile";
  cw->init();
}

void Wizard::loadFile(const char *fileName)
{
  if (fileName==0)
  {
    configFileName = QFileDialog::getOpenFileName();
  }
  else
  {
    configFileName = fileName;
  }

  if ( !configFileName.isNull() )
  {
    //initData( configFileName );
    loadConfig(configFileName);
    cw->init();

    statusBar()->message(configFileName, messageTimeout);			
  } 
}

void Wizard::loadFile()
{
  if (hasChanged)
  {
    switch( QMessageBox::warning( 
            this, "DoxyWizard", "Load a new file and lose changes?\n",
            "Yes", "No", 0, 0, 1 ))
    {
      case 0: 
        break;
      default: // command aborted by the user 
        return;
    }
  }
  loadFile(0);
}

void Wizard::saveFile()
{
  //printf("configFileName=`%s'\n",configFileName.data());
  if (configFileName.isEmpty())
  {
    saveAsFile();
    return;
  }
  else
  {
    saveConfig(configFileName);
    statusBar()->message(configFileName + " saved", messageTimeout);
  }
  hasChanged = FALSE;
  refreshCaption();
}

void Wizard::saveAsFile()
{
  configFileName = QFileDialog::getSaveFileName();
  if (configFileName.isNull())
  {
    statusBar()->message("Save aborted", messageTimeout );
    return; // operation cancelled by the user
  }

  saveConfig(configFileName);
  statusBar()->message("Saved as "+ configFileName, messageTimeout );
  hasChanged = FALSE;
  refreshCaption();
}

void Wizard::quit()
{
  if (hasChanged)
  {
    switch( QMessageBox::warning( this, "DoxyWizard", "Quit and lose changes?\n",
            "Yes", "No", 0, 0, 1 ))
    {
      case 0: 
        qApp->quit();
        break;
      case 1:
        break;
    }
  }
  else
  {
    qApp->quit();
  }
}

void Wizard::changed()
{
  hasChanged = TRUE;
  refreshCaption();
}

void Wizard::refreshCaption()
{
  QString s;
  if (hasChanged) s=" *";
  setCaption("Doxywizard - ["+configFileName+s+"]");
}

void Wizard::about()
{
  QMessageBox::about(this, "DoxyWizard",
                      "<qt><center>A tool to create and edit configuration files "
                      "that can be read by doxygen.</center><p>"
                      "<center>Written by Dimitri van Heesch</center><p>"
                      "<center>(c) 2000</center></qt>"
                    );
}

//----------------------------------------------------------------------

ConfigFile::ConfigFile( QWidget *parent ) : QWidget( parent )
{
  QVBoxLayout *layout = new QVBoxLayout( this );

  // QTabWidget definition 
  QTabWidget *tab = new QTabWidget( this );
  layout->addWidget( tab );

  PageWidget *General = new PageWidget( tab, "General" );
  projectName = new InputString( "PROJECT_NAME", General, Config::projectName );
  QWhatsThis::add(projectName, 
    "The PROJECT_NAME tag is a single word (or a sequence of words surrounded "
    "by quotes) that should identify the project. "
  );
  connect(projectName,SIGNAL(changed()),this,SIGNAL(changed()));
  projectNumber = new InputString( "PROJECT_NUMBER", General, Config::projectNumber );
  QWhatsThis::add(projectNumber, 
    "The PROJECT_NUMBER tag can be used to enter a project or revision number. "
    "This could be handy for archiving the generated documentation or "
    "if some version control system is used."
  );
  connect(projectNumber,SIGNAL(changed()),this,SIGNAL(changed()));
  outputDir = new InputString( "OUTPUT_DIRECTORY", General, Config::outputDir,InputString::StringDir );
  QWhatsThis::add(outputDir, 
    "The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) "
    "base path where the generated documentation will be put. "
    "If a relative path is entered, it will be relative to the location "
    "where doxygen was started. If left blank the current directory will be used."
  );
  connect(outputDir,SIGNAL(changed()),this,SIGNAL(changed()));
  outputLanguage = new InputString( "OUTPUT_LANGUAGE", General, Config::outputLanguage,InputString::StringFixed );
  QWhatsThis::add(outputLanguage, 
    "The OUTPUT_LANGUAGE tag is used to specify the language in which all "
    "documentation generated by doxygen is written. Doxygen will use this "
    "information to generate all constant output in the proper language. "
    "The default language is English, other supported languages are: "
    "Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, "
    "Spanish, Russian, Croatian, Polish, and Portuguese."
  );
  connect(outputLanguage,SIGNAL(changed()),this,SIGNAL(changed()));
  outputLanguage->addValue("English");
  outputLanguage->addValue("Dutch");
  outputLanguage->addValue("French");
  outputLanguage->addValue("Italian");
  outputLanguage->addValue("Czech");
  outputLanguage->addValue("Swedish");
  outputLanguage->addValue("German");
  outputLanguage->addValue("Finnish");
  outputLanguage->addValue("Japanese");
  outputLanguage->addValue("Spanish");
  outputLanguage->addValue("Russian");
  outputLanguage->addValue("Croatian");
  outputLanguage->addValue("Polish");
  outputLanguage->addValue("Portuguese");
  extractAllFlag = new InputBool( "EXTRACT_ALL", General, Config::extractAllFlag );
  QWhatsThis::add(extractAllFlag, 
    "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in "
    "documentation are documented, even if no documentation was available. "
    "Private class members and static file members will be hidden unless "
    "the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES "
  );
  connect(extractAllFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  extractPrivateFlag = new InputBool( "EXTRACT_PRIVATE", General, Config::extractPrivateFlag );
  QWhatsThis::add(extractPrivateFlag, 
    "If the EXTRACT_PRIVATE tag is set to YES all private members of a class "
    "will be included in the documentation. "
  );
  connect(extractPrivateFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  extractStaticFlag = new InputBool( "EXTRACT_STATIC", General, Config::extractStaticFlag );
  QWhatsThis::add(extractStaticFlag, 
    "If the EXTRACT_STATIC tag is set to YES all static members of a file "
    "will be included in the documentation. "
  );
  connect(extractStaticFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  hideMemberFlag = new InputBool( "HIDE_UNDOC_MEMBERS", General, Config::hideMemberFlag );
  QWhatsThis::add(hideMemberFlag, 
    "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all "
    "undocumented members of documented classes, files or namespaces. "
    "If set to NO (the default) these members will be included in the "
    "various overviews, but no documentation section is generated. "
    "This option has no effect if EXTRACT_ALL is enabled. "
  );
  connect(hideMemberFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  hideClassFlag = new InputBool( "HIDE_UNDOC_CLASSES", General, Config::hideClassFlag );
  QWhatsThis::add(hideClassFlag, 
    "If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all "
    "undocumented classes that are normally visible in the class hierarchy. "
    "If set to NO (the default) these class will be included in the various "
    "overviews. This option has no effect if EXTRACT_ALL is enabled. "
  );
  connect(hideClassFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  briefMemDescFlag = new InputBool( "BRIEF_MEMBER_DESC", General, Config::briefMemDescFlag );
  QWhatsThis::add(briefMemDescFlag, 
    "If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will "
    "include brief member descriptions after the members that are listed in "
    "the file and class documentation (similar to JavaDoc). "
    "Set to NO to disable this. "
  );
  connect(briefMemDescFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  repeatBriefFlag = new InputBool( "REPEAT_BRIEF", General, Config::repeatBriefFlag );
  QWhatsThis::add(repeatBriefFlag, 
    "If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend "
    "the brief description of a member or function before the detailed description. "
    "Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the "
    "brief descriptions will be completely suppressed. "
  );
  connect(repeatBriefFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  alwaysDetailsFlag = new InputBool( "ALWAYS_DETAILED_SEC", General, Config::alwaysDetailsFlag );
  QWhatsThis::add(alwaysDetailsFlag, 
    "If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then "
    "Doxygen will generate a detailed section even if there is only a brief "
    "description. "
  );
  connect(alwaysDetailsFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  fullPathNameFlag = new InputBool( "FULL_PATH_NAMES", General, Config::fullPathNameFlag );
  QWhatsThis::add(fullPathNameFlag, 
    "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full "
    "path before files name in the file list and in the header files. If set "
    "to NO the shortest path that makes the file name unique will be used. "
  );
  connect(fullPathNameFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(fullPathNameFlag,SIGNAL(toggled(bool)),SLOT(fullPathNameFlagToggle(bool)));
  stripFromPath = new InputStrList( "STRIP_FROM_PATH", General, Config::stripFromPath );
  QWhatsThis::add(stripFromPath, 
    "If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag "
    "can be used to strip a user defined part of the path. Stripping is "
    "only done if one of the specified strings matches the left-hand part of "
    "the path. It is allowed to use relative paths in the argument list."
  );
  connect(stripFromPath,SIGNAL(changed()),this,SIGNAL(changed()));
  internalDocsFlag = new InputBool( "INTERNAL_DOCS", General, Config::internalDocsFlag );
  QWhatsThis::add(internalDocsFlag, 
    "The INTERNAL_DOCS tag determines if documentation "
    "that is typed after a \\internal command is included. If the tag is set "
    "to NO (the default) then the documentation will be excluded. "
    "Set it to YES to include the internal documentation. "
  );
  connect(internalDocsFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  classDiagramFlag = new InputBool( "CLASS_DIAGRAMS", General, Config::classDiagramFlag );
  QWhatsThis::add(classDiagramFlag, 
    "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will "
    "generate a class diagram (in Html and LaTeX) for classes with base or "
    "super classes. Setting the tag to NO turns the diagrams off. "
  );
  connect(classDiagramFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  sourceBrowseFlag = new InputBool( "SOURCE_BROWSER", General, Config::sourceBrowseFlag );
  QWhatsThis::add(sourceBrowseFlag, 
    "If the SOURCE_BROWSER tag is set to YES then a list of source files will "
    "be generated. Documented entities will be cross-referenced with these sources. "
  );
  connect(sourceBrowseFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  inlineSourceFlag = new InputBool( "INLINE_SOURCES", General, Config::inlineSourceFlag );
  QWhatsThis::add(inlineSourceFlag, 
    "Setting the INLINE_SOURCES tag to YES will include the body "
    "of functions and classes directly in the documentation. "
  );
  connect(inlineSourceFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  stripCommentsFlag = new InputBool( "STRIP_CODE_COMMENTS", General, Config::stripCommentsFlag );
  QWhatsThis::add(stripCommentsFlag, 
    "Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct "
    "doxygen to hide any special comment blocks from generated source code "
    "fragments. Normal C and C++ comments will always remain visible. "
  );
  connect(stripCommentsFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  caseSensitiveNames = new InputBool( "CASE_SENSE_NAMES", General, Config::caseSensitiveNames );
  QWhatsThis::add(caseSensitiveNames, 
    "If the CASE_SENSE_NAMES tag is set to NO (the default) then Doxygen "
    "will only generate file names in lower case letters. If set to "
    "YES upper case letters are also allowed. This is useful if you have "
    "classes or files whose names only differ in case and if your file system "
    "supports case sensitive file names. "
  );
  connect(caseSensitiveNames,SIGNAL(changed()),this,SIGNAL(changed()));
  hideScopeNames = new InputBool( "HIDE_SCOPE_NAMES", General, Config::hideScopeNames );
  QWhatsThis::add(hideScopeNames, 
    "If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen "
    "will show members with their full class and namespace scopes in the "
    "documentation. If set to YES the scope will be hidden. "
  );
  connect(hideScopeNames,SIGNAL(changed()),this,SIGNAL(changed()));
  verbatimHeaderFlag = new InputBool( "VERBATIM_HEADERS", General, Config::verbatimHeaderFlag );
  QWhatsThis::add(verbatimHeaderFlag, 
    "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen "
    "will generate a verbatim copy of the header file for each class for "
    "which an include is specified. Set to NO to disable this. "
  );
  connect(verbatimHeaderFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  showIncFileFlag = new InputBool( "SHOW_INCLUDE_FILES", General, Config::showIncFileFlag );
  QWhatsThis::add(showIncFileFlag, 
    "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen "
    "will put list of the files that are included by a file in the documentation "
    "of that file. "
  );
  connect(showIncFileFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  autoBriefFlag = new InputBool( "JAVADOC_AUTOBRIEF", General, Config::autoBriefFlag );
  QWhatsThis::add(autoBriefFlag, 
    "If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen "
    "will interpret the first line (until the first dot) of a JavaDoc-style "
    "comment as the brief description. If set to NO, the Javadoc-style will "
    "behave just like the Qt-style comments. "
  );
  connect(autoBriefFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  inheritDocsFlag = new InputBool( "INHERIT_DOCS", General, Config::inheritDocsFlag );
  QWhatsThis::add(inheritDocsFlag, 
    "If the INHERIT_DOCS tag is set to YES (the default) then an undocumented "
    "member inherits the documentation from any documented member that it "
    "reimplements. "
  );
  connect(inheritDocsFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  inlineInfoFlag = new InputBool( "INLINE_INFO", General, Config::inlineInfoFlag );
  QWhatsThis::add(inlineInfoFlag, 
    "If the INLINE_INFO tag is set to YES (the default) then a tag [inline] "
    "is inserted in the documentation for inline members. "
  );
  connect(inlineInfoFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  sortMembersFlag = new InputBool( "SORT_MEMBER_DOCS", General, Config::sortMembersFlag );
  QWhatsThis::add(sortMembersFlag, 
    "If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen "
    "will sort the (detailed) documentation of file and class members "
    "alphabetically by member name. If set to NO the members will appear in "
    "declaration order. "
  );
  connect(sortMembersFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  tabSize = new InputInt( "TAB_SIZE", General, Config::tabSize,1,16 );
  QWhatsThis::add(tabSize, 
    "The TAB_SIZE tag can be used to set the number of spaces in a tab. "
    "Doxygen uses this value to replace tabs by spaces in code fragments. "
  );
  connect(tabSize,SIGNAL(changed()),this,SIGNAL(changed()));
  sectionFilterList = new InputStrList( "ENABLED_SECTIONS", General, Config::sectionFilterList );
  QWhatsThis::add(sectionFilterList, 
    "The ENABLE_SECTIONS tag can be used to enable conditional "
    "documentation sections, marked by \\if sectionname ... \\endif. "
  );
  connect(sectionFilterList,SIGNAL(changed()),this,SIGNAL(changed()));
  generateTodoList = new InputBool( "GENERATE_TODOLIST", General, Config::generateTodoList );
  QWhatsThis::add(generateTodoList, 
    "The GENERATE_TODOLIST tag can be used to enable (YES) or "
    "disable (NO) the todo list. This list is created by putting \\todo "
    "commands in the documentation."
  );
  connect(generateTodoList,SIGNAL(changed()),this,SIGNAL(changed()));
  generateTestList = new InputBool( "GENERATE_TESTLIST", General, Config::generateTestList );
  QWhatsThis::add(generateTestList, 
    "The GENERATE_TESTLIST tag can be used to enable (YES) or "
    "disable (NO) the test list. This list is created by putting \\test "
    "commands in the documentation."
  );
  connect(generateTestList,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *Messages = new PageWidget( tab, "Messages" );
  quietFlag = new InputBool( "QUIET", Messages, Config::quietFlag );
  QWhatsThis::add(quietFlag, 
    "The QUIET tag can be used to turn on/off the messages that are generated "
    "by doxygen. Possible values are YES and NO. If left blank NO is used. "
  );
  connect(quietFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  warningFlag = new InputBool( "WARNINGS", Messages, Config::warningFlag );
  QWhatsThis::add(warningFlag, 
    "The WARNINGS tag can be used to turn on/off the warning messages that are "
    "generated by doxygen. Possible values are YES and NO. If left blank "
    "NO is used. "
  );
  connect(warningFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  warningUndocFlag = new InputBool( "WARN_IF_UNDOCUMENTED", Messages, Config::warningUndocFlag );
  QWhatsThis::add(warningUndocFlag, 
    "If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings "
    "for undocumented members. If EXTRACT_ALL is set to YES then this flag will "
    "automatically be disabled. "
  );
  connect(warningUndocFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  warnFormat = new InputString( "WARN_FORMAT", Messages, Config::warnFormat );
  QWhatsThis::add(warnFormat, 
    "The WARN_FORMAT tag determines the format of the warning messages that "
    "doxygen can produce. The string should contain the $file, $line, and $text "
    "tags, which will be replaced by the file and line number from which the "
    "warning originated and the warning text. "
  );
  connect(warnFormat,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *Input = new PageWidget( tab, "Input" );
  inputSources = new InputStrList( "INPUT", Input, Config::inputSources,InputStrList::ListFileDir );
  QWhatsThis::add(inputSources, 
    "The INPUT tag can be used to specify the files and/or directories that contain "
    "documented source files. You may enter file names like \"myfile.cpp\" or "
    "directories like \"/usr/src/myproject\". Separate the files or directories "
    "with spaces. "
  );
  connect(inputSources,SIGNAL(changed()),this,SIGNAL(changed()));
  filePatternList = new InputStrList( "FILE_PATTERNS", Input, Config::filePatternList );
  QWhatsThis::add(filePatternList, 
    "If the value of the INPUT tag contains directories, you can use the "
    "FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp "
    "and *.h) to filter out the source-files in the directories. If left "
    "blank all files are included. "
  );
  connect(filePatternList,SIGNAL(changed()),this,SIGNAL(changed()));
  recursiveFlag = new InputBool( "RECURSIVE", Input, Config::recursiveFlag );
  QWhatsThis::add(recursiveFlag, 
    "The RECURSIVE tag can be used to turn specify whether or not subdirectories "
    "should be searched for input files as well. Possible values are YES and NO. "
    "If left blank NO is used. "
  );
  connect(recursiveFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  excludeSources = new InputStrList( "EXCLUDE", Input, Config::excludeSources,InputStrList::ListFileDir );
  QWhatsThis::add(excludeSources, 
    "The EXCLUDE tag can be used to specify files and/or directories that should "
    "excluded from the INPUT source files. This way you can easily exclude a "
    "subdirectory from a directory tree whose root is specified with the INPUT tag. "
  );
  connect(excludeSources,SIGNAL(changed()),this,SIGNAL(changed()));
  excludePatternList = new InputStrList( "EXCLUDE_PATTERNS", Input, Config::excludePatternList );
  QWhatsThis::add(excludePatternList, 
    "If the value of the INPUT tag contains directories, you can use the "
    "EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude "
    "certain files from those directories. "
  );
  connect(excludePatternList,SIGNAL(changed()),this,SIGNAL(changed()));
  examplePath = new InputStrList( "EXAMPLE_PATH", Input, Config::examplePath,InputStrList::ListDir );
  QWhatsThis::add(examplePath, 
    "The EXAMPLE_PATH tag can be used to specify one or more files or "
    "directories that contain example code fragments that are included (see "
    "the \\include command). "
  );
  connect(examplePath,SIGNAL(changed()),this,SIGNAL(changed()));
  examplePatternList = new InputStrList( "EXAMPLE_PATTERNS", Input, Config::examplePatternList );
  QWhatsThis::add(examplePatternList, 
    "If the value of the EXAMPLE_PATH tag contains directories, you can use the "
    "EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp "
    "and *.h) to filter out the source-files in the directories. If left "
    "blank all files are included. "
  );
  connect(examplePatternList,SIGNAL(changed()),this,SIGNAL(changed()));
  imagePath = new InputStrList( "IMAGE_PATH", Input, Config::imagePath,InputStrList::ListDir );
  QWhatsThis::add(imagePath, 
    "The IMAGE_PATH tag can be used to specify one or more files or "
    "directories that contain image that are included in the documentation (see "
    "the \\image command). "
  );
  connect(imagePath,SIGNAL(changed()),this,SIGNAL(changed()));
  inputFilter = new InputString( "INPUT_FILTER", Input, Config::inputFilter,InputString::StringFile );
  QWhatsThis::add(inputFilter, 
    "The INPUT_FILTER tag can be used to specify a program that doxygen should "
    "invoke to filter for each input file. Doxygen will invoke the filter program "
    "by executing (via popen()) the command <filter> <input-file>, where <filter> "
    "is the value of the INPUT_FILTER tag, and <input-file> is the name of an "
    "input file. Doxygen will then use the output that the filter program writes "
    "to standard output. "
  );
  connect(inputFilter,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *Index = new PageWidget( tab, "Index" );
  alphaIndexFlag = new InputBool( "ALPHABETICAL_INDEX", Index, Config::alphaIndexFlag );
  QWhatsThis::add(alphaIndexFlag, 
    "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index "
    "of all compounds will be generated. Enable this if the project "
    "contains a lot of classes, structs, unions or interfaces. "
  );
  connect(alphaIndexFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  colsInAlphaIndex = new InputInt( "COLS_IN_ALPHA_INDEX", Index, Config::colsInAlphaIndex,1,20 );
  QWhatsThis::add(colsInAlphaIndex, 
    "If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then "
    "the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns "
    "in which this list will be split (can be a number in the range [1..20]) "
  );
  connect(colsInAlphaIndex,SIGNAL(changed()),this,SIGNAL(changed()));
  ignorePrefixList = new InputStrList( "IGNORE_PREFIX", Index, Config::ignorePrefixList );
  QWhatsThis::add(ignorePrefixList, 
    "In case all classes in a project start with a common prefix, all "
    "classes will be put under the same header in the alphabetical index. "
    "The IGNORE_PREFIX tag can be used to specify one or more prefixes that "
    "should be ignored while generating the index headers. "
  );
  connect(ignorePrefixList,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *HTML = new PageWidget( tab, "HTML" );
  generateHtml = new InputBool( "GENERATE_HTML", HTML, Config::generateHtml );
  QWhatsThis::add(generateHtml, 
    "If the GENERATE_HTML tag is set to YES (the default) Doxygen will "
    "generate HTML output. "
  );
  connect(generateHtml,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(generateHtml,SIGNAL(toggled(bool)),SLOT(generateHtmlToggle(bool)));
  htmlOutputDir = new InputString( "HTML_OUTPUT", HTML, Config::htmlOutputDir,InputString::StringDir );
  QWhatsThis::add(htmlOutputDir, 
    "The HTML_OUTPUT tag is used to specify where the HTML docs will be put. "
    "If a relative path is entered the value of OUTPUT_DIRECTORY will be "
    "put in front of it. If left blank `html' will be used as the default path. "
  );
  connect(htmlOutputDir,SIGNAL(changed()),this,SIGNAL(changed()));
  headerFile = new InputString( "HTML_HEADER", HTML, Config::headerFile,InputString::StringFile );
  QWhatsThis::add(headerFile, 
    "The HTML_HEADER tag can be used to specify a personal HTML header for "
    "each generated HTML page. If it is left blank doxygen will generate a "
    "standard header."
  );
  connect(headerFile,SIGNAL(changed()),this,SIGNAL(changed()));
  footerFile = new InputString( "HTML_FOOTER", HTML, Config::footerFile,InputString::StringFile );
  QWhatsThis::add(footerFile, 
    "The HTML_FOOTER tag can be used to specify a personal HTML footer for "
    "each generated HTML page. If it is left blank doxygen will generate a "
    "standard footer."
  );
  connect(footerFile,SIGNAL(changed()),this,SIGNAL(changed()));
  htmlStyleSheet = new InputString( "HTML_STYLESHEET", HTML, Config::htmlStyleSheet,InputString::StringFile );
  QWhatsThis::add(htmlStyleSheet, 
    "The HTML_STYLESHEET tag can be used to specify a user defined cascading "
    "style sheet that is used by each HTML page. It can be used to "
    "fine-tune the look of the HTML output. If the tag is left blank doxygen "
    "will generate a default style sheet "
  );
  connect(htmlStyleSheet,SIGNAL(changed()),this,SIGNAL(changed()));
  htmlAlignMemberFlag = new InputBool( "HTML_ALIGN_MEMBERS", HTML, Config::htmlAlignMemberFlag );
  QWhatsThis::add(htmlAlignMemberFlag, 
    "If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, "
    "files or namespaces will be aligned in HTML using tables. If set to "
    "NO a bullet list will be used. "
  );
  connect(htmlAlignMemberFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  htmlHelpFlag = new InputBool( "GENERATE_HTMLHELP", HTML, Config::htmlHelpFlag );
  QWhatsThis::add(htmlHelpFlag, 
    "If the GENERATE_HTMLHELP tag is set to YES, additional index files "
    "will be generated that can be used as input for tools like the "
    "Microsoft HTML help workshop to generate a compressed HTML help file (.chm) "
    "of the generated HTML documentation. "
  );
  connect(htmlHelpFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  noIndexFlag = new InputBool( "DISABLE_INDEX", HTML, Config::noIndexFlag );
  QWhatsThis::add(noIndexFlag, 
    "The DISABLE_INDEX tag can be used to turn on/off the condensed index at "
    "top of each HTML page. The value NO (the default) enables the index and "
    "the value YES disables it. "
  );
  connect(noIndexFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *LaTeX = new PageWidget( tab, "LaTeX" );
  generateLatex = new InputBool( "GENERATE_LATEX", LaTeX, Config::generateLatex );
  QWhatsThis::add(generateLatex, 
    "If the GENERATE_LATEX tag is set to YES (the default) Doxygen will "
    "generate Latex output. "
  );
  connect(generateLatex,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(generateLatex,SIGNAL(toggled(bool)),SLOT(generateLatexToggle(bool)));
  latexOutputDir = new InputString( "LATEX_OUTPUT", LaTeX, Config::latexOutputDir,InputString::StringDir );
  QWhatsThis::add(latexOutputDir, 
    "The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. "
    "If a relative path is entered the value of OUTPUT_DIRECTORY will be "
    "put in front of it. If left blank `latex' will be used as the default path. "
  );
  connect(latexOutputDir,SIGNAL(changed()),this,SIGNAL(changed()));
  compactLatexFlag = new InputBool( "COMPACT_LATEX", LaTeX, Config::compactLatexFlag );
  QWhatsThis::add(compactLatexFlag, 
    "If the COMPACT_LATEX tag is set to YES Doxygen generates more compact "
    "LaTeX documents. This may be useful for small projects and may help to "
    "save some trees in general. "
  );
  connect(compactLatexFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  paperType = new InputString( "PAPER_TYPE", LaTeX, Config::paperType,InputString::StringFixed );
  QWhatsThis::add(paperType, 
    "The PAPER_TYPE tag can be used to set the paper type that is used "
    "by the printer. Possible values are: a4, a4wide, letter, legal and "
    "executive. If left blank a4wide will be used. "
  );
  connect(paperType,SIGNAL(changed()),this,SIGNAL(changed()));
  paperType->addValue("a4");
  paperType->addValue("a4wide");
  paperType->addValue("letter");
  paperType->addValue("legal");
  paperType->addValue("executive");
  extraPackageList = new InputStrList( "EXTRA_PACKAGES", LaTeX, Config::extraPackageList );
  QWhatsThis::add(extraPackageList, 
    "The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX "
    "packages that should be included in the LaTeX output. "
  );
  connect(extraPackageList,SIGNAL(changed()),this,SIGNAL(changed()));
  latexHeaderFile = new InputString( "LATEX_HEADER", LaTeX, Config::latexHeaderFile,InputString::StringFile );
  QWhatsThis::add(latexHeaderFile, 
    "The LATEX_HEADER tag can be used to specify a personal LaTeX header for "
    "the generated latex document. The header should contain everything until "
    "the first chapter. If it is left blank doxygen will generate a "
    "standard header. Notice: only use this tag if you know what you are doing! "
  );
  connect(latexHeaderFile,SIGNAL(changed()),this,SIGNAL(changed()));
  pdfHyperFlag = new InputBool( "PDF_HYPERLINKS", LaTeX, Config::pdfHyperFlag );
  QWhatsThis::add(pdfHyperFlag, 
    "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated "
    "is prepared for conversion to pdf (using ps2pdf). The pdf file will "
    "contain links (just like the HTML output) instead of page references "
    "This makes the output suitable for online browsing using a pdf viewer. "
  );
  connect(pdfHyperFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  usePDFLatexFlag = new InputBool( "USE_PDFLATEX", LaTeX, Config::usePDFLatexFlag );
  QWhatsThis::add(usePDFLatexFlag, 
    "If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of "
    "plain latex in the generated Makefile. Set this option to YES to get a "
    "higher quality PDF documentation. "
  );
  connect(usePDFLatexFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  latexBatchModeFlag = new InputBool( "LATEX_BATCHMODE", LaTeX, Config::latexBatchModeFlag );
  QWhatsThis::add(latexBatchModeFlag, 
    "If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. "
    "command to the generated LaTeX files. This will instruct LaTeX to keep "
    "running if errors occur, instead of asking the user for help. "
    "This option is also used when generating formulas in HTML. "
  );
  connect(latexBatchModeFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *RTF = new PageWidget( tab, "RTF" );
  generateRTF = new InputBool( "GENERATE_RTF", RTF, Config::generateRTF );
  QWhatsThis::add(generateRTF, 
    "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output "
    "The RTF output is optimised for Word 97 and may not look very pretty with "
    "other RTF readers or editors."
  );
  connect(generateRTF,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(generateRTF,SIGNAL(toggled(bool)),SLOT(generateRTFToggle(bool)));
  rtfOutputDir = new InputString( "RTF_OUTPUT", RTF, Config::rtfOutputDir,InputString::StringDir );
  QWhatsThis::add(rtfOutputDir, 
    "The RTF_OUTPUT tag is used to specify where the RTF docs will be put. "
    "If a relative path is entered the value of OUTPUT_DIRECTORY will be "
    "put in front of it. If left blank `rtf' will be used as the default path. "
  );
  connect(rtfOutputDir,SIGNAL(changed()),this,SIGNAL(changed()));
  compactRTFFlag = new InputBool( "COMPACT_RTF", RTF, Config::compactRTFFlag );
  QWhatsThis::add(compactRTFFlag, 
    "If the COMPACT_RTF tag is set to YES Doxygen generates more compact "
    "RTF documents. This may be useful for small projects and may help to "
    "save some trees in general. "
  );
  connect(compactRTFFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  rtfHyperFlag = new InputBool( "RTF_HYPERLINKS", RTF, Config::rtfHyperFlag );
  QWhatsThis::add(rtfHyperFlag, 
    "If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated "
    "will contain hyperlink fields. The RTF file will "
    "contain links (just like the HTML output) instead of page references. "
    "This makes the output suitable for online browsing using a WORD or other. "
    "programs which support those fields. "
    "Note: wordpad (write) and others do not support links. "
  );
  connect(rtfHyperFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  rtfStylesheetFile = new InputString( "RTF_STYLESHEET_FILE", RTF, Config::rtfStylesheetFile,InputString::StringFile );
  QWhatsThis::add(rtfStylesheetFile, 
    "Load stylesheet definitions from file. Syntax is similar to doxygen's "
    "config file, i.e. a series of assigments. You only have to provide "
    "replacements, missing definitions are set to their default value. "
  );
  connect(rtfStylesheetFile,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *Man = new PageWidget( tab, "Man" );
  generateMan = new InputBool( "GENERATE_MAN", Man, Config::generateMan );
  QWhatsThis::add(generateMan, 
    "If the GENERATE_MAN tag is set to YES (the default) Doxygen will "
    "generate man pages "
  );
  connect(generateMan,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(generateMan,SIGNAL(toggled(bool)),SLOT(generateManToggle(bool)));
  manOutputDir = new InputString( "MAN_OUTPUT", Man, Config::manOutputDir,InputString::StringDir );
  QWhatsThis::add(manOutputDir, 
    "The MAN_OUTPUT tag is used to specify where the man pages will be put. "
    "If a relative path is entered the value of OUTPUT_DIRECTORY will be "
    "put in front of it. If left blank `man' will be used as the default path. "
  );
  connect(manOutputDir,SIGNAL(changed()),this,SIGNAL(changed()));
  manExtension = new InputString( "MAN_EXTENSION", Man, Config::manExtension );
  QWhatsThis::add(manExtension, 
    "The MAN_EXTENSION tag determines the extension that is added to "
    "the generated man pages (default is the subroutine's section .3) "
  );
  connect(manExtension,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *XML = new PageWidget( tab, "XML" );
  generateXML = new InputBool( "GENERATE_XML", XML, Config::generateXML );
  QWhatsThis::add(generateXML, 
    "If the GENERATE_XML tag is set to YES Doxygen will "
    "generate an XML file that captures the structure of "
    "the code including all documentation. Warning: This feature "
    "is still experimental and very incomplete."
  );
  connect(generateXML,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *Preprocessor = new PageWidget( tab, "Preprocessor" );
  preprocessingFlag = new InputBool( "ENABLE_PREPROCESSING", Preprocessor, Config::preprocessingFlag );
  QWhatsThis::add(preprocessingFlag, 
    "If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will "
    "evaluate all C-preprocessor directives found in the sources and include "
    "files. "
  );
  connect(preprocessingFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(preprocessingFlag,SIGNAL(toggled(bool)),SLOT(preprocessingFlagToggle(bool)));
  macroExpansionFlag = new InputBool( "MACRO_EXPANSION", Preprocessor, Config::macroExpansionFlag );
  QWhatsThis::add(macroExpansionFlag, 
    "If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro "
    "names in the source code. If set to NO (the default) only conditional "
    "compilation will be performed. Macro expansion can be done in a controlled "
    "way by setting EXPAND_ONLY_PREDEF to YES. "
  );
  connect(macroExpansionFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  onlyPredefinedFlag = new InputBool( "EXPAND_ONLY_PREDEF", Preprocessor, Config::onlyPredefinedFlag );
  QWhatsThis::add(onlyPredefinedFlag, 
    "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES "
    "then the macro expansion is limited to the macros specified with the "
    "PREDEFINED and EXPAND_AS_PREDEFINED tags. "
  );
  connect(onlyPredefinedFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  searchIncludeFlag = new InputBool( "SEARCH_INCLUDES", Preprocessor, Config::searchIncludeFlag );
  QWhatsThis::add(searchIncludeFlag, 
    "If the SEARCH_INCLUDES tag is set to YES (the default) the includes files "
    "in the INCLUDE_PATH (see below) will be search if a #include is found. "
  );
  connect(searchIncludeFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  includePath = new InputStrList( "INCLUDE_PATH", Preprocessor, Config::includePath,InputStrList::ListDir );
  QWhatsThis::add(includePath, 
    "The INCLUDE_PATH tag can be used to specify one or more directories that "
    "contain include files that are not input files but should be processed by "
    "the preprocessor. "
  );
  connect(includePath,SIGNAL(changed()),this,SIGNAL(changed()));
  includeFilePatternList = new InputStrList( "INCLUDE_FILE_PATTERNS", Preprocessor, Config::includeFilePatternList );
  QWhatsThis::add(includeFilePatternList, 
    "You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard "
    "patterns (like *.h and *.hpp) to filter out the header-files in the "
    "directories. If left blank, the patterns specified with FILE_PATTERNS will "
    "be used. "
  );
  connect(includeFilePatternList,SIGNAL(changed()),this,SIGNAL(changed()));
  predefined = new InputStrList( "PREDEFINED", Preprocessor, Config::predefined );
  QWhatsThis::add(predefined, 
    "The PREDEFINED tag can be used to specify one or more macro names that "
    "are defined before the preprocessor is started (similar to the -D option of "
    "gcc). The argument of the tag is a list of macros of the form: name "
    "or name=definition (no spaces). If the definition and the = are "
    "omitted =1 is assumed. "
  );
  connect(predefined,SIGNAL(changed()),this,SIGNAL(changed()));
  expandAsDefinedList = new InputStrList( "EXPAND_AS_DEFINED", Preprocessor, Config::expandAsDefinedList );
  QWhatsThis::add(expandAsDefinedList, 
    "If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then "
    "this tag can be used to specify a list of macro names that should be expanded. "
    "The macro definition that is found in the sources will be used. "
    "Use the PREDEFINED tag if you want to use a different macro definition. "
  );
  connect(expandAsDefinedList,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *External = new PageWidget( tab, "External" );
  tagFileList = new InputStrList( "TAGFILES", External, Config::tagFileList,InputStrList::ListFile );
  QWhatsThis::add(tagFileList, 
    "The TAGFILES tag can be used to specify one or more tagfiles. "
  );
  connect(tagFileList,SIGNAL(changed()),this,SIGNAL(changed()));
  genTagFile = new InputString( "GENERATE_TAGFILE", External, Config::genTagFile,InputString::StringFile );
  QWhatsThis::add(genTagFile, 
    "When a file name is specified after GENERATE_TAGFILE, doxygen will create "
    "a tag file that is based on the input files it reads. "
  );
  connect(genTagFile,SIGNAL(changed()),this,SIGNAL(changed()));
  allExtFlag = new InputBool( "ALLEXTERNALS", External, Config::allExtFlag );
  QWhatsThis::add(allExtFlag, 
    "If the ALLEXTERNALS tag is set to YES all external classes will be listed "
    "in the class index. If set to NO only the inherited external classes "
    "will be listed. "
  );
  connect(allExtFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  perlPath = new InputString( "PERL_PATH", External, Config::perlPath,InputString::StringDir );
  QWhatsThis::add(perlPath, 
    "The PERL_PATH should be the absolute path and name of the perl script "
    "interpreter (i.e. the result of `which perl'). "
  );
  connect(perlPath,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *Dot = new PageWidget( tab, "Dot" );
  haveDotFlag = new InputBool( "HAVE_DOT", Dot, Config::haveDotFlag );
  QWhatsThis::add(haveDotFlag, 
    "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is "
    "available from the path. This tool is part of Graphviz, a graph visualization "
    "toolkit from AT&T and Lucent Bell Labs. The other options in this section "
    "have no effect if this option is set to NO (the default) "
  );
  connect(haveDotFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(haveDotFlag,SIGNAL(toggled(bool)),SLOT(haveDotFlagToggle(bool)));
  classGraphFlag = new InputBool( "CLASS_GRAPH", Dot, Config::classGraphFlag );
  QWhatsThis::add(classGraphFlag, 
    "If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen "
    "will generate a graph for each documented class showing the direct and "
    "indirect inheritance relations. Setting this tag to YES will force the "
    "the CLASS_DIAGRAMS tag to NO."
  );
  connect(classGraphFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  collGraphFlag = new InputBool( "COLLABORATION_GRAPH", Dot, Config::collGraphFlag );
  QWhatsThis::add(collGraphFlag, 
    "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen "
    "will generate a graph for each documented class showing the direct and "
    "indirect implementation dependencies (inheritance, containment, and "
    "class references variables) of the class with other documented classes. "
  );
  connect(collGraphFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  includeGraphFlag = new InputBool( "INCLUDE_GRAPH", Dot, Config::includeGraphFlag );
  QWhatsThis::add(includeGraphFlag, 
    "If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to "
    "YES then doxygen will generate a graph for each documented file showing "
    "the direct and indirect include dependencies of the file with other "
    "documented files. "
  );
  connect(includeGraphFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  includedByGraphFlag = new InputBool( "INCLUDED_BY_GRAPH", Dot, Config::includedByGraphFlag );
  QWhatsThis::add(includedByGraphFlag, 
    "If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to "
    "YES then doxygen will generate a graph for each documented header file showing "
    "the documented files that directly or indirectly include this file "
  );
  connect(includedByGraphFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  gfxHierarchyFlag = new InputBool( "GRAPHICAL_HIERARCHY", Dot, Config::gfxHierarchyFlag );
  QWhatsThis::add(gfxHierarchyFlag, 
    "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen "
    "will graphical hierarchy of all classes instead of a textual one. "
  );
  connect(gfxHierarchyFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  dotPath = new InputString( "DOT_PATH", Dot, Config::dotPath,InputString::StringDir );
  QWhatsThis::add(dotPath, 
    "The tag DOT_PATH can be used to specify the path where the dot tool can be "
    "found. If left blank, it is assumed the dot tool can be found on the path. "
  );
  connect(dotPath,SIGNAL(changed()),this,SIGNAL(changed()));
  maxDotGraphWidth = new InputInt( "MAX_DOT_GRAPH_WIDTH", Dot, Config::maxDotGraphWidth,100,30000 );
  QWhatsThis::add(maxDotGraphWidth, 
    "The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width "
    "(in pixels) of the graphs generated by dot. If a graph becomes larger than "
    "this value, doxygen will try to truncate the graph, so that it fits within "
    "the specified constraint. Beware that most browsers cannot cope with very "
    "large images. "
  );
  connect(maxDotGraphWidth,SIGNAL(changed()),this,SIGNAL(changed()));
  maxDotGraphHeight = new InputInt( "MAX_DOT_GRAPH_HEIGHT", Dot, Config::maxDotGraphHeight,100,30000 );
  QWhatsThis::add(maxDotGraphHeight, 
    "The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height "
    "(in pixels) of the graphs generated by dot. If a graph becomes larger than "
    "this value, doxygen will try to truncate the graph, so that it fits within "
    "the specified constraint. Beware that most browsers cannot cope with very "
    "large images. "
  );
  connect(maxDotGraphHeight,SIGNAL(changed()),this,SIGNAL(changed()));
  PageWidget *Search = new PageWidget( tab, "Search" );
  searchEngineFlag = new InputBool( "SEARCHENGINE", Search, Config::searchEngineFlag );
  QWhatsThis::add(searchEngineFlag, 
    "The SEARCHENGINE tag specifies whether or not a search engine should be "
    "used. If set to NO the values of all tags below this one will be ignored. "
  );
  connect(searchEngineFlag,SIGNAL(changed()),this,SIGNAL(changed()));
  connect(searchEngineFlag,SIGNAL(toggled(bool)),SLOT(searchEngineFlagToggle(bool)));
  cgiName = new InputString( "CGI_NAME", Search, Config::cgiName );
  QWhatsThis::add(cgiName, 
    "The CGI_NAME tag should be the name of the CGI script that "
    "starts the search engine (doxysearch) with the correct parameters. "
    "A script with this name will be generated by doxygen. "
  );
  connect(cgiName,SIGNAL(changed()),this,SIGNAL(changed()));
  cgiURL = new InputString( "CGI_URL", Search, Config::cgiURL );
  QWhatsThis::add(cgiURL, 
    "The CGI_URL tag should be the absolute URL to the directory where the "
    "cgi binaries are located. See the documentation of your http daemon for "
    "details. "
  );
  connect(cgiURL,SIGNAL(changed()),this,SIGNAL(changed()));
  docURL = new InputString( "DOC_URL", Search, Config::docURL );
  QWhatsThis::add(docURL, 
    "The DOC_URL tag should be the absolute URL to the directory where the "
    "documentation is located. If left blank the absolute path to the "
    "documentation, with file:// prepended to it, will be used. "
  );
  connect(docURL,SIGNAL(changed()),this,SIGNAL(changed()));
  docAbsPath = new InputString( "DOC_ABSPATH", Search, Config::docAbsPath,InputString::StringDir );
  QWhatsThis::add(docAbsPath, 
    "The DOC_ABSPATH tag should be the absolute path to the directory where the "
    "documentation is located. If left blank the directory on the local machine "
    "will be used. "
  );
  connect(docAbsPath,SIGNAL(changed()),this,SIGNAL(changed()));
  binAbsPath = new InputString( "BIN_ABSPATH", Search, Config::binAbsPath,InputString::StringDir );
  QWhatsThis::add(binAbsPath, 
    "The BIN_ABSPATH tag must point to the directory where the doxysearch binary "
    "is installed. "
  );
  connect(binAbsPath,SIGNAL(changed()),this,SIGNAL(changed()));
  extDocPathList = new InputStrList( "EXT_DOC_PATHS", Search, Config::extDocPathList,InputStrList::ListDir );
  QWhatsThis::add(extDocPathList, 
    "The EXT_DOC_PATHS tag can be used to specify one or more paths to "
    "documentation generated for other projects. This allows doxysearch to search "
    "the documentation for these projects as well. "
  );
  connect(extDocPathList,SIGNAL(changed()),this,SIGNAL(changed()));
  General->addStretch(1);
  fullPathNameFlagToggle(Config::fullPathNameFlag);
  Messages->addStretch(1);
  Input->addStretch(1);
  Index->addStretch(1);
  HTML->addStretch(1);
  generateHtmlToggle(Config::generateHtml);
  LaTeX->addStretch(1);
  generateLatexToggle(Config::generateLatex);
  RTF->addStretch(1);
  generateRTFToggle(Config::generateRTF);
  Man->addStretch(1);
  generateManToggle(Config::generateMan);
  XML->addStretch(1);
  Preprocessor->addStretch(1);
  preprocessingFlagToggle(Config::preprocessingFlag);
  External->addStretch(1);
  Dot->addStretch(1);
  haveDotFlagToggle(Config::haveDotFlag);
  Search->addStretch(1);
  searchEngineFlagToggle(Config::searchEngineFlag);
  
}

ConfigFile::~ConfigFile()
{
}

void ConfigFile::fullPathNameFlagToggle(bool state)
{
  stripFromPath->setEnabled(state);
}

void ConfigFile::generateHtmlToggle(bool state)
{
  htmlOutputDir->setEnabled(state);
  headerFile->setEnabled(state);
  footerFile->setEnabled(state);
  htmlStyleSheet->setEnabled(state);
  htmlAlignMemberFlag->setEnabled(state);
  htmlHelpFlag->setEnabled(state);
  noIndexFlag->setEnabled(state);
}

void ConfigFile::generateLatexToggle(bool state)
{
  latexOutputDir->setEnabled(state);
  compactLatexFlag->setEnabled(state);
  paperType->setEnabled(state);
  extraPackageList->setEnabled(state);
  latexHeaderFile->setEnabled(state);
  pdfHyperFlag->setEnabled(state);
  usePDFLatexFlag->setEnabled(state);
  latexBatchModeFlag->setEnabled(state);
}

void ConfigFile::generateRTFToggle(bool state)
{
  rtfOutputDir->setEnabled(state);
  compactRTFFlag->setEnabled(state);
  rtfHyperFlag->setEnabled(state);
  rtfStylesheetFile->setEnabled(state);
}

void ConfigFile::generateManToggle(bool state)
{
  manOutputDir->setEnabled(state);
  manExtension->setEnabled(state);
}

void ConfigFile::preprocessingFlagToggle(bool state)
{
  macroExpansionFlag->setEnabled(state);
  onlyPredefinedFlag->setEnabled(state);
  searchIncludeFlag->setEnabled(state);
  includePath->setEnabled(state);
  includeFilePatternList->setEnabled(state);
  predefined->setEnabled(state);
}

void ConfigFile::haveDotFlagToggle(bool state)
{
  classGraphFlag->setEnabled(state);
  collGraphFlag->setEnabled(state);
  includeGraphFlag->setEnabled(state);
  includedByGraphFlag->setEnabled(state);
  gfxHierarchyFlag->setEnabled(state);
  dotPath->setEnabled(state);
  maxDotGraphWidth->setEnabled(state);
  maxDotGraphHeight->setEnabled(state);
}

void ConfigFile::searchEngineFlagToggle(bool state)
{
  cgiName->setEnabled(state);
  cgiURL->setEnabled(state);
  docURL->setEnabled(state);
  docAbsPath->setEnabled(state);
  binAbsPath->setEnabled(state);
  extDocPathList->setEnabled(state);
}


void ConfigFile::init()
{
  projectName->init();
  projectNumber->init();
  outputDir->init();
  outputLanguage->init();
  extractAllFlag->init();
  extractPrivateFlag->init();
  extractStaticFlag->init();
  hideMemberFlag->init();
  hideClassFlag->init();
  briefMemDescFlag->init();
  repeatBriefFlag->init();
  alwaysDetailsFlag->init();
  fullPathNameFlag->init();
  stripFromPath->init();
  internalDocsFlag->init();
  classDiagramFlag->init();
  sourceBrowseFlag->init();
  inlineSourceFlag->init();
  stripCommentsFlag->init();
  caseSensitiveNames->init();
  hideScopeNames->init();
  verbatimHeaderFlag->init();
  showIncFileFlag->init();
  autoBriefFlag->init();
  inheritDocsFlag->init();
  inlineInfoFlag->init();
  sortMembersFlag->init();
  tabSize->init();
  sectionFilterList->init();
  generateTodoList->init();
  generateTestList->init();
  quietFlag->init();
  warningFlag->init();
  warningUndocFlag->init();
  warnFormat->init();
  inputSources->init();
  filePatternList->init();
  recursiveFlag->init();
  excludeSources->init();
  excludePatternList->init();
  examplePath->init();
  examplePatternList->init();
  imagePath->init();
  inputFilter->init();
  alphaIndexFlag->init();
  colsInAlphaIndex->init();
  ignorePrefixList->init();
  generateHtml->init();
  htmlOutputDir->init();
  headerFile->init();
  footerFile->init();
  htmlStyleSheet->init();
  htmlAlignMemberFlag->init();
  htmlHelpFlag->init();
  noIndexFlag->init();
  generateLatex->init();
  latexOutputDir->init();
  compactLatexFlag->init();
  paperType->init();
  extraPackageList->init();
  latexHeaderFile->init();
  pdfHyperFlag->init();
  usePDFLatexFlag->init();
  latexBatchModeFlag->init();
  generateRTF->init();
  rtfOutputDir->init();
  compactRTFFlag->init();
  rtfHyperFlag->init();
  rtfStylesheetFile->init();
  generateMan->init();
  manOutputDir->init();
  manExtension->init();
  generateXML->init();
  preprocessingFlag->init();
  macroExpansionFlag->init();
  onlyPredefinedFlag->init();
  searchIncludeFlag->init();
  includePath->init();
  includeFilePatternList->init();
  predefined->init();
  expandAsDefinedList->init();
  tagFileList->init();
  genTagFile->init();
  allExtFlag->init();
  perlPath->init();
  haveDotFlag->init();
  classGraphFlag->init();
  collGraphFlag->init();
  includeGraphFlag->init();
  includedByGraphFlag->init();
  gfxHierarchyFlag->init();
  dotPath->init();
  maxDotGraphWidth->init();
  maxDotGraphHeight->init();
  searchEngineFlag->init();
  cgiName->init();
  cgiURL->init();
  docURL->init();
  docAbsPath->init();
  binAbsPath->init();
  extDocPathList->init();
}

//----------------------------------------------------------------------

int main(int argc,char **argv)
{ 
  QApplication::setColorSpec( QApplication::NormalColor );
  QApplication app(argc,argv);
  Wizard wizard(argc,argv);
  app.setMainWidget( &wizard );
  wizard.show();  
  return app.exec();
}
