diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2000-04-23 18:39:17 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2000-04-23 18:39:17 (GMT) |
commit | e2b4a623decf7c8b4435f742f05d07323ad8d6f2 (patch) | |
tree | ae15def425ebe4c6c13d7b4ffd8e147e03d535b3 /addon | |
parent | 0e7fba152ca1c24593a5c9b01460116d16ca3f97 (diff) | |
download | Doxygen-e2b4a623decf7c8b4435f742f05d07323ad8d6f2.zip Doxygen-e2b4a623decf7c8b4435f742f05d07323ad8d6f2.tar.gz Doxygen-e2b4a623decf7c8b4435f742f05d07323ad8d6f2.tar.bz2 |
Release-1.1.2-20000423
Diffstat (limited to 'addon')
25 files changed, 4090 insertions, 0 deletions
diff --git a/addon/configgen/Makefile.in b/addon/configgen/Makefile.in new file mode 100644 index 0000000..aa8dd7a --- /dev/null +++ b/addon/configgen/Makefile.in @@ -0,0 +1,42 @@ +# +# +# +# Copyright (C) 1997-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. +# + +CFGGEN_DIR = bin + +all: Makefile.configgen config.h config.l + $(MAKE) -f Makefile.configgen $@ + +Makefile.configgen: configgen.pro + $(PERL) $(TMAKE) configgen.pro >Makefile.configgen + +config.h: $(CFGGEN_DIR)/configgen config_templ.h + $(CFGGEN_DIR)/configgen config_templ.h >config.h + +config.l: $(CFGGEN_DIR)/configgen config_templ.l + $(CFGGEN_DIR)/configgen config_templ.l >config.l + +$(CFGGEN_DIR)/configgen: Makefile.configgen configgen.cpp + $(MAKE) -f Makefile.configgen + +tmake: + $(PERL) $(TMAKE) configgen.pro >Makefile.configgen + +install: + $(CP) config.l config.h ../../src + +clean: Makefile.configgen + $(MAKE) -f Makefile.configgen clean + +distclean: clean + $(RM) config.cpp config.h config.l Makefile.configgen + +FORCE: diff --git a/addon/configgen/config_templ.h b/addon/configgen/config_templ.h new file mode 100644 index 0000000..f895bab --- /dev/null +++ b/addon/configgen/config_templ.h @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-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. + * + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#ifndef DOXYWIZARD +#include "qtbc.h" +#endif +#include <qstrlist.h> +#include <qfile.h> + +extern void parseConfig(const QCString &config); +extern void writeTemplateConfig(QFile *f,bool shortList); +extern void checkConfig(); +extern void configStrToVal(); +extern void substituteEnvironmentVars(); + +struct Config +{ + static void init(); + +#CONFIG Header +}; + +#endif diff --git a/addon/configgen/config_templ.l b/addon/configgen/config_templ.l new file mode 100644 index 0000000..a86156c --- /dev/null +++ b/addon/configgen/config_templ.l @@ -0,0 +1,729 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-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. + * + */ + +%{ + +/* + * includes + */ +#include <stdio.h> +#include <stdlib.h> +#include <iostream.h> +#include <assert.h> +#include <ctype.h> + +#include <qfileinfo.h> +#include <qdir.h> +#include <qtextstream.h> +#include <qregexp.h> + +#include "config.h" +#include "version.h" + +#ifdef DOXYWIZARD +#include <stdarg.h> +void err(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +void warn(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +#else +#include "doxygen.h" +#include "message.h" +#include "pre.h" +#include "version.h" +#include "language.h" +#endif + +#define YY_NEVER_INTERACTIVE 1 +#define YY_NO_UNPUT + +/* ----------------------------------------------------------------- + * + * exported variables + */ + +#CONFIG Config + +/* ----------------------------------------------------------------- + * + * static variables + */ + +static const char * inputString; +static int inputPosition; +static int yyLineNr; +static QCString tmpString; +static QCString * s=0; +static bool * b=0; +static QStrList * l=0; +static int lastState; +static QCString elemStr; +//static QCString tabSizeString; +//static QCString colsInAlphaIndexString; +#CONFIG Static + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +%} + +%option noyywrap + +%x Start +%x SkipComment +%x GetString +%x GetBool +%x GetStrList +%x GetQuotedString +%x GetEnvVar + +%% + +<*>\0x0d +<Start,GetString,GetStrList,GetBool>"#" { BEGIN(SkipComment); } +#CONFIG Rules +<Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); } +<GetString,GetBool>\n { yyLineNr++; BEGIN(Start); } +<GetStrList>\n { + yyLineNr++; + if (!elemStr.isEmpty()) + { + //printf("elemStr1=`%s'\n",elemStr.data()); + l->append(elemStr); + } + BEGIN(Start); + } +<GetStrList>[ \t]+ { + if (!elemStr.isEmpty()) + { + //printf("elemStr2=`%s'\n",elemStr.data()); + l->append(elemStr); + } + elemStr.resize(0); + } +<GetString>[^ \"\t\r\n]+ { (*s)+=yytext; } +<GetString,GetStrList>"\"" { lastState=YY_START; + BEGIN(GetQuotedString); + tmpString.resize(0); + } + /* +<GetString,GetStrList,GetQuotedString>"\$\(" { + //printf(">> Enter env\n"); + lastEnvState=YY_START; + BEGIN(GetEnvVar); + } +<GetEnvVar>[a-z_A-Z0-9]+")" { + yytext[yyleng-1]='\0'; + const char *env=getenv(yytext); + int i; + int l=strlen(env); + //printf("env name=`%s' text=`%s'\n",yytext,env); + for (i=l-1;i>=0;i--) unput(env[i]); + BEGIN(lastEnvState); + } + */ +<GetQuotedString>"\""|"\n" { + //printf("Quoted String = `%s'\n",tmpString.data()); + if (lastState==GetString) + (*s)+=tmpString; + else + elemStr+=tmpString; + if (*yytext=='\n') + { + err("Warning: Missing end quote (\") on line %d\n",yyLineNr); + yyLineNr++; + } + BEGIN(lastState); + } +<GetQuotedString>"\\\"" { + tmpString+='"'; + } +<GetQuotedString>. { tmpString+=*yytext; } +<GetBool>[a-zA-Z]+ { + QCString bs=yytext; + bs=bs.upper(); + if (bs=="YES") + *b=TRUE; + else if (bs=="NO") + *b=FALSE; + else + { + *b=FALSE; + warn("Warning: Invalid value `%s' for " + "boolean tag in line %d; use YES or NO\n", + bs.data(),yyLineNr); + } + } +<GetStrList>[^ \#\"\t\r\n]+ { + elemStr+=yytext; + } +<SkipComment>\n { yyLineNr++; BEGIN(Start); } +<SkipComment>\\[ \r\t]*\n { yyLineNr++; BEGIN(Start); } +<*>\\[ \r\t]*\n { yyLineNr++; } +<*>. +<*>\n { yyLineNr++ ; } + +%% + +/*@ ---------------------------------------------------------------------------- + */ + + +void dumpConfig() +{ +#CONFIG Dump +} + +void Config::init() +{ +#CONFIG Init +} + +static void writeBoolValue(QTextStream &t,bool v) +{ + if (v) t << "YES"; else t << "NO"; +} + +static void writeIntValue(QTextStream &t,int i) +{ + t << i; +} + +static void writeStringValue(QTextStream &t,QCString &s) +{ + const char *p=s.data(); + char c; + bool hasBlanks=FALSE; + if (p) + { + while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t'); + if (hasBlanks) + t << "\"" << s << "\""; + else + t << s; + } +} + +static void writeStringList(QTextStream &t,QStrList &l) +{ + const char *p = l.first(); + bool first=TRUE; + while (p) + { + char c; + const char *s=p; + bool hasBlanks=FALSE; + while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t'); + if (!first) t << " "; + first=FALSE; + if (hasBlanks) t << "\"" << s << "\""; else t << s; + p = l.next(); + if (p) t << " \\" << endl; + } +} + +void writeTemplateConfig(QFile *f,bool sl) +{ + QTextStream t(f); +#ifdef DOXYWIZARD + t << "# Doxygen configuration generated by Doxywizard version " << versionString << endl; +#else + t << "# Doxyfile " << versionString << endl << endl; +#endif + if (!sl) + { + t << "# This file describes the settings to be used by doxygen for a project\n"; + t << "#\n"; + t << "# All text after a hash (#) is considered a comment and will be ignored\n"; + t << "# The format is:\n"; + t << "# TAG = value [value, ...]\n"; + t << "# Values that contain spaces should be placed between quotes (\" \")\n"; + } +#CONFIG Template +} + +void configStrToVal() +{ + if (tabSizeString.isEmpty()) + { + Config::tabSize=8; + } + else + { + bool ok; + int ts = tabSizeString.toInt(&ok); + if (!ok || ts<1 || ts>16) + { + warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n"); + ts=8; + } + Config::tabSize = ts; + } + + if (colsInAlphaIndexString.isEmpty()) + { + Config::colsInAlphaIndex=5; + } + else + { + bool ok; + int cols = colsInAlphaIndexString.toInt(&ok); + if (!ok || cols<1 || cols>20) + { + warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n" + "Using the default of 5 columns!\n"); + cols = 5; + } + Config::colsInAlphaIndex=cols; + } +} + +static void substEnvVarsInString(QCString &s) +{ + QRegExp re("\\$([a-z_A-Z0-9]+)"); + int p=0; + int i,l; + //printf("substEnvVarInString(%s) start\n",s.data()); + while ((i=re.match(s,p,&l))!=-1) + { + //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data()); + QCString env=getenv(s.mid(i+2,l-3)); + substEnvVarsInString(env); // recursively expand variables if needed. + s = s.left(i)+env+s.right(s.length()-i-l); + p=i+l; + } + //printf("substEnvVarInString(%s) end\n",s.data()); +} + +static void substEnvVarsInStrList(QStrList &sl) +{ + char *s = sl.first(); + while (s) + { + QCString result(s); + substEnvVarsInString(result); + + int l=result.length(); + int i,p=0; + // skip spaces + // search for a "word" + for (i=0;i<l;i++) + { + char c; + // skip until start of new word + for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++) + p=i; // p marks the start index of the word + // skip until end of a word + for (;i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"');i++); + if (i<l) // not at the end of the string + { + if (c=='"') // word within quotes + { + p=i+1; + for (i++;i<l;i++) + { + c=result.at(i); + if (c=='"') // end quote + { + // replace the string in the list and go to the next item. + sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item. + sl.next(); // current item is now the old item + p=i+1; + break; + } + else if (c=='\\') // skip escaped stuff + { + i++; + } + } + } + else if (c==' ' || c=='\t') // separator + { + // replace the string in the list and go to the next item. + sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item. + sl.next(); // current item is now the old item + p=i+1; + } + } + } + if (p!=l) // add the leftover as a string + { + // replace the string in the list and go to the next item. + sl.insert(sl.at(),result.right(l-p)); // insert new item before current item. + sl.next(); // current item is now the old item + } + + // remove the old unexpanded string from the list + i=sl.at(); + sl.remove(); // current item index changes if the last element is removed. + if (sl.at()==i) // not last item + s = sl.current(); + else // just removed last item + s = 0; + } +} + + +void substituteEnvironmentVars() +{ +#CONFIG Substenv +} + +void checkConfig() +{ + //if (!projectName.isEmpty()) + //{ + // projectName[0]=toupper(projectName[0]); + //} + + + // set default man page extension if non is given by the user + if (Config::manExtension.isEmpty()) + { + Config::manExtension=".3"; + } + + Config::paperType = Config::paperType.lower().stripWhiteSpace(); + if (Config::paperType.isEmpty()) + { + Config::paperType = "a4wide"; + } + if (Config::paperType!="a4" && Config::paperType!="a4wide" && Config::paperType!="letter" && + Config::paperType!="legal" && Config::paperType!="executive") + { + err("Error: Unknown page type specified"); + } + + Config::outputLanguage=Config::outputLanguage.stripWhiteSpace(); + if (Config::outputLanguage.isEmpty()) + { + Config::outputLanguage = "English"; +#ifndef DOXYWIZARD + setTranslator("English"); +#endif + } + else + { +#ifndef DOXYWIZARD + if (!setTranslator(Config::outputLanguage)) + { + err("Error: Output language %s not supported! Using English instead.\n", + Config::outputLanguage.data()); + } +#endif + } + + // Test to see if output directory is valid + if (Config::outputDir.isEmpty()) + Config::outputDir=QDir::currentDirPath(); + else + { + QDir dir(Config::outputDir); + if (!dir.exists()) + { + dir.setPath(QDir::currentDirPath()); + if (!dir.mkdir(Config::outputDir)) + { + err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not " + "exist and cannot be created\n",Config::outputDir.data()); + exit(1); + } + else if (!Config::quietFlag) + { + err("Notice: Output directory `%s' does not exist. " + "I have created it for you.\n", Config::outputDir.data()); + } + dir.cd(Config::outputDir); + } + Config::outputDir=dir.absPath(); + } + + if (Config::htmlOutputDir.isEmpty() && Config::generateHtml) + { + Config::htmlOutputDir=Config::outputDir+"/html"; + } + else if (Config::htmlOutputDir && Config::htmlOutputDir[0]!='/') + { + Config::htmlOutputDir.prepend(Config::outputDir+'/'); + } + QDir htmlDir(Config::htmlOutputDir); + if (Config::generateHtml && !htmlDir.exists() && + !htmlDir.mkdir(Config::htmlOutputDir)) + { + err("Could not create output directory %s\n",Config::htmlOutputDir.data()); + exit(1); + } + + if (Config::latexOutputDir.isEmpty() && Config::generateLatex) + { + Config::latexOutputDir=Config::outputDir+"/latex"; + } + else if (Config::latexOutputDir && Config::latexOutputDir[0]!='/') + { + Config::latexOutputDir.prepend(Config::outputDir+'/'); + } + QDir latexDir(Config::latexOutputDir); + if (Config::generateLatex && !latexDir.exists() && + !latexDir.mkdir(Config::latexOutputDir)) + { + err("Could not create output directory %s\n",Config::latexOutputDir.data()); + exit(1); + } + + if (Config::rtfOutputDir.isEmpty() && Config::generateRTF) + { + Config::rtfOutputDir=Config::outputDir+"/rtf"; + } + else if (Config::rtfOutputDir && Config::rtfOutputDir[0]!='/') + { + Config::rtfOutputDir.prepend(Config::outputDir+'/'); + } + QDir rtfDir(Config::rtfOutputDir); + if (Config::generateRTF && !rtfDir.exists() && + !rtfDir.mkdir(Config::rtfOutputDir)) + { + err("Could not create output directory %s\n",Config::rtfOutputDir.data()); + exit(1); + } + + if (Config::manOutputDir.isEmpty() && Config::generateMan) + { + Config::manOutputDir=Config::outputDir+"/man"; + } + else if (Config::manOutputDir && Config::manOutputDir[0]!='/') + { + Config::manOutputDir.prepend(Config::outputDir+'/'); + } + QDir manDir(Config::manOutputDir); + if (Config::generateMan && !manDir.exists() && + !manDir.mkdir(Config::manOutputDir)) + { + err("Could not create output directory %s\n",Config::manOutputDir.data()); + exit(1); + } + + // Test to see if HTML header is valid + if (!Config::headerFile.isEmpty()) + { + QFileInfo fi(Config::headerFile); + if (!fi.exists()) + { + err("Error: tag HTML_HEADER: header file `%s' " + "does not exist\n",Config::headerFile.data()); + exit(1); + } + } + // Test to see if HTML footer is valid + if (!Config::footerFile.isEmpty()) + { + QFileInfo fi(Config::footerFile); + if (!fi.exists()) + { + err("Error: tag HTML_FOOTER: footer file `%s' " + "does not exist\n",Config::footerFile.data()); + exit(1); + } + } + // Test to see if LaTeX header is valid + if (!Config::latexHeaderFile.isEmpty()) + { + QFileInfo fi(Config::latexHeaderFile); + if (!fi.exists()) + { + err("Error: tag LATEX_HEADER: header file `%s' " + "does not exist\n",Config::latexHeaderFile.data()); + exit(1); + } + } + // check include path + char *s=Config::includePath.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) err("Warning: tag INCLUDE_PATH: include path `%s' " + "does not exist\n",s); +#ifndef DOXYWIZARD + addSearchDir(fi.absFilePath()); +#endif + s=Config::includePath.next(); + } + // check input + if (Config::inputSources.count()==0) + { + err("Error: tag INPUT: no input files specified after the INPUT tag.\n"); + exit(1); + } + else + { + s=Config::inputSources.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) + { + err("Error: tag INPUT: input source `%s' does not exist\n",s); + exit(1); + } + s=Config::inputSources.next(); + } + } + + // add default pattern if needed + if (Config::filePatternList.count()==0) + { + Config::filePatternList.append("*"); + } + + // add default pattern if needed + if (Config::examplePatternList.count()==0) + { + Config::examplePatternList.append("*"); + } + + // add default pattern if needed + //if (Config::imagePatternList.count()==0) + //{ + // Config::imagePatternList.append("*"); + //} + + // more checks needed if and only if the search engine is enabled. + if (Config::searchEngineFlag) + { + // check cgi name + if (Config::cgiName.isEmpty()) + { + err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); + exit(1); + } + // check cgi URL + if (Config::cgiURL.isEmpty()) + { + err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); + exit(1); + } + else if (Config::cgiURL.left(7)!="http://") + { + err("Error: tag CGI_URL: URL to cgi directory is invalid (must " + "start with http://).\n"); + exit(1); + } + // check documentation URL + if (Config::docURL.isEmpty()) + { + Config::docURL = Config::outputDir.copy().prepend("file://").append("html"); + } + else if (Config::docURL.left(7)!="http://" && Config::docURL.left(7)!="file://") + { + err("Error: tag DOC_URL: URL to documentation is invalid or " + "not absolute.\n"); + exit(1); + } + // check absolute documentation path + if (Config::docAbsPath.isEmpty()) + { + Config::docAbsPath = Config::outputDir+"/html"; + } + else if (Config::docAbsPath[0]!='/' && Config::docAbsPath[1]!=':') + { + err("Error: tag DOC_ABSPATH: path is not absolute!\n"); + exit(1); + } + // check path to doxysearch + if (Config::binAbsPath.isEmpty()) + { + err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " + "specified.\n"); + exit(1); + } + else if (Config::binAbsPath[0]!='/' && Config::binAbsPath[1]!=':') + { + err("Error: tag BIN_ABSPATH: path is not absolute!\n"); + exit(1); + } + + // check perl path + bool found=FALSE; + if (Config::perlPath.isEmpty()) + { + QFileInfo fi; + fi.setFile("/usr/bin/perl"); + if (fi.exists()) + { + Config::perlPath="/usr/bin/perl"; + found=TRUE; + } + else + { + fi.setFile("/usr/local/bin/perl"); + if (fi.exists()) + { + Config::perlPath="/usr/local/bin/perl"; + found=TRUE; + } + } + } + if (!found) + { + QFileInfo fi(Config::perlPath); + if (!fi.exists()) + { + warn("Warning: tag PERL_PATH: perl interpreter not found at default or" + "user specified (%s) location\n", + Config::perlPath.data()); + } + } + } + +#if defined(_WIN32) + if (Config::haveDotFlag) _putenv("DOTFONTPATH=."); +#endif + +} + +void parseConfig(const QCString &s) +{ + inputString = s; + inputPosition = 0; + yyLineNr = 1; + configYYrestart( configYYin ); + BEGIN( Start ); + configYYlex(); +} + +//extern "C" { // some bogus code to keep the compiler happy +// int configYYwrap() { return 1 ; } +//} diff --git a/addon/configgen/configgen.cpp b/addon/configgen/configgen.cpp new file mode 100644 index 0000000..553db76 --- /dev/null +++ b/addon/configgen/configgen.cpp @@ -0,0 +1,1530 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 2000 by Joerg Baumann & 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. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +// includes + +#include "qtbc.h" +#include <qtextstream.h> +#include <qfile.h> +#include <qlist.h> +#include <qdict.h> +#include <qstringlist.h> + +#include <stdio.h> + +static QString spaces=" "; + +void init(); // defined below + +// Iterate over all options calling the spezified method +#define FORALL(x) \ +{\ + ConfigOption *co=ConfigOption::optionList.first();\ + while (co)\ + {\ + co->x;\ + co=ConfigOption::optionList.next();\ + }\ +} + +/*! convert a normal string \a s into a string that can be embedded in C code. + * The \a prefix string will be placed before each string line and the + * \a postfix string will be placed after each string. + */ +static void stringToC(QTextStream &t,QCString &s, + const char *prefix,const char *postfix) +{ + int i=0,l=s.length(); + bool eol=TRUE; + for (i=0;i<l;i++) + { + char c; + switch ((c=s[i])) + { + case '\n': + t << postfix << endl; + eol=TRUE; + break; + case '\\': + case '"': + if (eol) t << prefix; + t << "\\" << (char)c; + eol=FALSE; + break; + default: + if (eol) t << prefix; + eol=FALSE; + t << (char)c; + break; + } + } + if (!eol) t << postfix << endl; +} + +class ConfigBool; + +/*! baseclass for options */ +class ConfigOption +{ + public: + static QList<ConfigOption> optionList; + static QDict<ConfigOption> optionDict; + QCString getVarName() const { return varName; } + + virtual ~ConfigOption() {} + + virtual void printHeader(QTextStream &t) + { + t << " static " << type << " " << varName + << "; // " << shortDesc << endl; + } + virtual void printStatic(QTextStream &) {} + virtual void printConfig(QTextStream &t) + { + t << type << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = \"" << defaultValue << "\""; + t << ";" << endl; + } + virtual void printRules(QTextStream &) + { + } + virtual void printDump(QTextStream &) + { + } + virtual void printCheck(QTextStream &t) + { + // FIXME + if (!check.isEmpty()) t << check << endl; + } + virtual void printInit(QTextStream &t) + { + t << " Config::" << varName << " = " + << defaultValue << ";" << endl; + } + virtual void printTemplate(QTextStream &t) + { + t << " if (!sl)" << endl; + t << " {" << endl; + t << " t << \"\\n\";" << endl; + stringToC(t,longDesc," t << \"# ","\\n\";"); + t << " t << \"\\n\";" << endl; + t << " }" << endl; + t << " t << \"" << cfgName << " = \";" << endl; + t << " " << writeFunc << "(t,Config::" << varName << ");" << endl; + t << " t << \"\\n\";" << endl; + } + virtual void printSubstEnv(QTextStream &) {} + virtual void printWidgets(QTextStream &,int) = 0; + virtual void addDependency(ConfigOption *) + { + fprintf(stderr,"Error: dependency add for non boolean option!\n"); + } + void setDependsOn(ConfigBool *b) { depends=b; } + + protected: + ConfigOption(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,const char * type_, + const char * type2_,const char * writeFunc_ + ): + varName(var), cfgName(cfg), defaultValue(value), shortDesc(short_), + longDesc(long_), type(type_), type2(type2_), writeFunc(writeFunc_) + { + if (optionDict.find(var)!=0) + { + fprintf(stderr,"Error: configuration variable found more than once!\n"); + } + else + { + optionList.append(this); + optionDict.insert(var,this); + } + depends=0; + } + + void tclQuote(QTextStream &t,const char *s) + { + t << "{"; + for (const char *p=s;*p!=0;p++) + { + if (strchr("{}",*p)) t << '\\'; + t << (*p); + } + t << "} "; + } + + QCString varName; // name as in Config::name + QCString cfgName; // name as in cfgfile + QCString defaultValue; // default value + QCString shortDesc; // short description + QCString longDesc; // long description + QCString type,type2; // + QCString writeFunc; // + QCString check; // + ConfigBool *depends; +}; + +QList<ConfigOption> ConfigOption::optionList; +QDict<ConfigOption> ConfigOption::optionDict; + +void addDependency(const char *src,const char *dst) +{ + ConfigOption *sopt = ConfigOption::optionDict.find(src); + ConfigOption *dopt = ConfigOption::optionDict.find(dst); + if (!sopt) + { + fprintf(stderr,"Error: option %s not defined!\n",src); + } + if (!dopt) + { + fprintf(stderr,"Error: option %s not defined!\n",dst); + } + dopt->addDependency(sopt); + sopt->setDependsOn((ConfigBool *)dopt); +} + + +class ConfigInfo : public ConfigOption +{ + public: + ConfigInfo(const char *var,const char * short_) + : ConfigOption(var,"","",short_,"","","","") {} + static void add(const char *var,const char * short_); + void printHeader(QTextStream &) {} + void printConfig(QTextStream &) {} + void printRules(QTextStream &) {} + virtual void printTemplate(QTextStream &t) + { + t << " if (!sl)" << endl; + t << " {" << endl; + t << " t << \"\\n\";" << endl; + t << " }" << endl; + t << " t << \"#---------------------------------------------------------------------------\\n\";" << endl; + t << " t << \"# " << shortDesc << "\\n\";" << endl; + t << " t << \"#---------------------------------------------------------------------------\\n\";" << endl; + } + virtual void printInit(QTextStream &) {} + virtual void printDump(QTextStream &t) + { + t << " printf(\"# " << shortDesc << "\\n\");" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch(pass) + { + case 0: + t << " PageWidget *" << varName << " = new PageWidget( tab, \"" + << varName << "\" );" << endl; + break; + case 1: + t << " " << varName << "->addStretch(1);" << endl; + break; + default: + break; + } + } + QCString getVarName() { return varName; } +}; + +class ConfigList : public ConfigOption +{ + public: + enum WidgetType { String, File, Dir, FileAndDir }; + ConfigList(ConfigInfo *parent,const char * var,const char * cfg,const char * value, + const char * short_,const char * long_, WidgetType w) + : ConfigOption(var,cfg,value,short_,long_,"QStrList","List","writeStringList"), + m_parent(parent), + m_widgetType(w) + { + } + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w=String); + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetStrList); l=&Config::" << varName; + t << "; l->clear(); elemStr=\"\"; }" << endl; + } + virtual void printInit(QTextStream &t) + { + t << " Config::" << varName; + if (!defaultValue.isEmpty()) + { + t << " = \"" << defaultValue << "\""; + } + else + { + t << ".clear()"; + } + t << ";" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " {" << endl; + t << " char *is=Config::" << varName << ".first();" << endl; + t << " while (is)" << endl; + t << " {" << endl; + t << " printf(\"" << varName << "=`%s'\\n\",is);" << endl; + t << " is=Config::" << varName << ".next();" << endl; + t << " }" << endl; + t << " }" << endl; + } + virtual void printSubstEnv(QTextStream &t) + { + t << " substEnvVarsInStrList( Config::" << varName << " );" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputStrList( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" << varName; + if (m_widgetType!=String) + { + t << ","; + switch(m_widgetType) + { + case File: t << "InputStrList::ListFile"; break; + case Dir: t << "InputStrList::ListDir"; break; + case FileAndDir: t << "InputStrList::ListFileDir"; break; + default: break; + } + } + t << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + } + break; + case 2: + { + t << " InputStrList *" << varName << ";" << endl; + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + break; + default: + break; + } + } + private: + ConfigInfo *m_parent; + WidgetType m_widgetType; +}; + +class ConfigString : public ConfigOption +{ + public: + enum WidgetType { String, File, Dir }; + ConfigString(ConfigInfo *parent, const char * var,const char * cfg,const char * value, + const char * short_,const char * long_, WidgetType w + ) + : ConfigOption(var,cfg,value,short_,long_, + "QCString","String","writeStringValue" + ), + m_parent(parent), + m_widgetType(w) + { + } + + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w=String); + static void addFixedValue(const char *var, const char *value); + + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetString); s=&Config::" << varName; + t << "; s->resize(0); }" << endl; + } + virtual void printInit(QTextStream &t) + { + t << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = \"" << defaultValue << "\""; + else t << ".resize(0)"; + t << ";" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " printf(\"" << varName << "=`%s'\\n\",Config::" << varName << ".data());" << endl; + } + virtual void printSubstEnv(QTextStream &t) + { + t << " substEnvVarsInString( Config::" << varName << " );" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputString( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" << varName; + if (m_widgetType!=String || m_values.count()>0) + { + t << ","; + switch (m_widgetType) + { + case File: + t << "InputString::StringFile"; + break; + case Dir: + t << "InputString::StringDir"; + break; + default: + t << "InputString::StringFixed"; + break; + } + } + + t << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + if (m_values.count()>0) + { + for ( QStringList::Iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + t << " " << varName << "->addValue(\"" << (*it) << "\");" << endl; + } + } + } + break; + case 2: + { + t << " InputString *" << varName << ";" << endl; + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + break; + default: + break; + } + } + void addValue(const char *val) + { + m_values.append(val); + } + private: + ConfigInfo *m_parent; + WidgetType m_widgetType; + QStringList m_values; +}; + +class ConfigInt : public ConfigOption +{ + public: + ConfigInt(ConfigInfo *parent,const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,int minVal,int maxVal) + : ConfigOption(var,cfg,value,short_,long_,"int ","Int","writeIntValue"), + m_parent(parent), m_minVal(minVal), m_maxVal(maxVal) + { + } + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,int minVal,int maxVal); + virtual void printConfig(QTextStream &t) + { + t << type << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = " << defaultValue; + t << ";" << endl; + } + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetString); s=&" << varName; + t << "String; s->resize(0); }" << endl; + } + virtual void printStatic(QTextStream &t) + { + t << "static QCString " << varName << "String;" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " printf(\"" << varName << "=`%d'\\n\",Config::" << varName << ");" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputInt( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" + << varName << "," << m_minVal << "," << m_maxVal << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + } + break; + case 2: + { + t << " InputInt *" << varName << ";" << endl; + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + break; + default: + break; + } + } + private: + ConfigInfo *m_parent; + int m_minVal; + int m_maxVal; +}; + +class ConfigBool : public ConfigOption +{ + public: + ConfigBool(ConfigInfo *parent,const char * var,const char * cfg,const char * value, + const char * short_,const char * long_) + : ConfigOption(var,cfg,value,short_,long_,"bool ","Bool","writeBoolValue"), + m_parent(parent) {} + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_); + virtual void printConfig(QTextStream &t) + { + t << type << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = " << defaultValue; + t << ";" << endl; + } + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetBool); b=&Config::" << varName; + t << "; }" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " printf(\"" << varName << "=`%d'\\n\",Config::" << varName << ");" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputBool( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" << varName << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + if (dependencies.count()>0) + { + t << " connect(" << varName << ",SIGNAL(toggled(bool)),SLOT(" + << varName << "Toggle(bool)));" << endl; + } + } + break; + case 1: + { + if (dependencies.count()>0) + { + t << " " << varName << "Toggle(Config::" << varName << ");" << endl; + } + } + break; + case 2: + { + t << " InputBool *" << varName << ";" << endl; + } + break; + case 3: + { + if (dependencies.count()>0) + { + t << " void " << varName << "Toggle(bool);" << endl; + } + } + break; + case 4: + { + if (dependencies.count()>0) + { + t << "void ConfigFile::" << varName << "Toggle(bool state)" << endl; + t << "{" << endl; + ConfigOption *o=dependencies.first(); + while (o) + { + t << " " << o->getVarName() << "->setEnabled(state);" << endl; + o=dependencies.next(); + } + t << "}" << endl << endl; + } + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + default: + break; + } + } + virtual void addDependency(ConfigOption *o) + { + dependencies.append(o); + } + private: + ConfigInfo *m_parent; + QList<ConfigOption> dependencies; +}; + +static ConfigInfo *g_lastConfigInfo; + +void ConfigList::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w) +{ + ConfigOption* o=new ConfigList(g_lastConfigInfo,var,cfg,value,short_,long_,w); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigString::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w) +{ + ConfigOption* o=new ConfigString(g_lastConfigInfo,var,cfg,value,short_,long_,w); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigInt::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,int minVal, int maxVal) +{ + ConfigOption* o=new ConfigInt(g_lastConfigInfo,var,cfg,value, + short_,long_,minVal,maxVal); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigBool::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_) +{ + ConfigOption* o=new ConfigBool(g_lastConfigInfo,var,cfg,value,short_,long_); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigInfo::add(const char * var,const char * short_) +{ + g_lastConfigInfo =new ConfigInfo(var,short_); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(g_lastConfigInfo); +} + +void ConfigString::addFixedValue(const char *var, const char *value) +{ + ConfigString *cs = (ConfigString *)optionDict[var]; + if (cs==0) + { + fprintf(stderr,"ConfigString::addFixedValue: unknown variable %s\n",var); + } + else + { + cs->addValue(value); + } +} + + +int main(int argc,char * argv[]) +{ + // check arguments + if (argc!=2) + { + fprintf(stderr,"usage: %s config-template\n",argv[0]); + exit(1); + } + + init(); // create options + QFile ctfile(argv[1]); + + // open template file + if (!ctfile.open(IO_ReadOnly)) + { + fprintf(stderr,"Error: couldn´t open file %s\n",argv[1]); + exit(1); + } + const int maxLineLen=10000; + char buf[maxLineLen]; + + + QFile f; + f.open(IO_WriteOnly,stdout); + QTextStream t(&f); + + // process template file + while (!ctfile.atEnd()) + { + ctfile.readLine(buf,maxLineLen-1); + if (QCString("#CONFIG Config\n" )==buf) FORALL(printConfig(t)) + else if (QCString("#CONFIG Static\n" )==buf) FORALL(printStatic(t)) + else if (QCString("#CONFIG Rules\n" )==buf) FORALL(printRules(t)) + else if (QCString("#CONFIG Dump\n" )==buf) FORALL(printDump(t)) + else if (QCString("#CONFIG Init\n" )==buf) FORALL(printInit(t)) + else if (QCString("#CONFIG Template\n")==buf) FORALL(printTemplate(t)) + else if (QCString("#CONFIG Check\n" )==buf) FORALL(printCheck(t)) + else if (QCString("#CONFIG Header\n" )==buf) FORALL(printHeader(t)) + else if (QCString("#CONFIG Substenv\n")==buf) FORALL(printSubstEnv(t)) + else if (QCString("#CONFIG Widgets0\n" )==buf) FORALL(printWidgets(t,0)) + else if (QCString("#CONFIG Widgets1\n" )==buf) FORALL(printWidgets(t,1)) + else if (QCString("#CONFIG WidgetVars\n" )==buf) FORALL(printWidgets(t,2)) + else if (QCString("#CONFIG WidgetSlots\n" )==buf) FORALL(printWidgets(t,3)) + else if (QCString("#CONFIG WidgetSlotImpl\n" )==buf) FORALL(printWidgets(t,4)) + else if (QCString("#CONFIG WidgetInit\n" )==buf) FORALL(printWidgets(t,5)) + else t << buf; + } + ctfile.close(); + return 0; +} + +void init() +{ + // option definitions + //----------------------------------------------------------------------------------------------- + ConfigInfo::add("General","General configuration options"); + //----------------------------------------------------------------------------------------------- + + ConfigString::add("projectName", + "PROJECT_NAME", + "", + "the name of the project", + "The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n" + "by quotes) that should identify the project. " + ); + ConfigString::add("projectNumber", + "PROJECT_NUMBER", + "", + "the number of the project", + "The PROJECT_NUMBER tag can be used to enter a project or revision number. \n" + "This could be handy for archiving the generated documentation or \n" + "if some version control system is used.\n" + ); + ConfigString::add("outputDir", + "OUTPUT_DIRECTORY", + "", + "the global output directory", + "The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n" + "base path where the generated documentation will be put. \n" + "If a relative path is entered, it will be relative to the location \n" + "where doxygen was started. If left blank the current directory will be used.\n", + ConfigString::Dir + ); + ConfigString::add("outputLanguage", + "OUTPUT_LANGUAGE", + "English", + "the output language", + "The OUTPUT_LANGUAGE tag is used to specify the language in which all \n" + "documentation generated by doxygen is written. Doxygen will use this \n" + "information to generate all constant output in the proper language. \n" + "The default language is English, other supported languages are: \n" + "Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, \n" + "Spanish and Russian\n" + ); + ConfigString::addFixedValue("outputLanguage","English"); + ConfigString::addFixedValue("outputLanguage","Dutch"); + ConfigString::addFixedValue("outputLanguage","French"); + ConfigString::addFixedValue("outputLanguage","Italian"); + ConfigString::addFixedValue("outputLanguage","Czech"); + ConfigString::addFixedValue("outputLanguage","Swedish"); + ConfigString::addFixedValue("outputLanguage","German"); + ConfigString::addFixedValue("outputLanguage","Russian"); + ConfigString::addFixedValue("outputLanguage","Japanese"); + ConfigString::addFixedValue("outputLanguage","Finnish"); + ConfigString::addFixedValue("outputLanguage","Spanish"); + ConfigBool::add( "quietFlag", + "QUIET", + "FALSE", + "generate progress messages flag", + "The QUIET tag can be used to turn on/off the messages that are generated \n" + "by doxygen. Possible values are YES and NO. If left blank NO is used. \n" + ); + ConfigBool::add( "warningFlag", + "WARNINGS", + "TRUE", + "generate warnings flag", + "The WARNINGS tag can be used to turn on/off the warning messages that are \n" + "generated by doxygen. Possible values are YES and NO. If left blank \n" + "NO is used. \n" + ); + ConfigBool::add( "noIndexFlag", + "DISABLE_INDEX", + "FALSE", + "generate condensed index flag", + "The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n" + "top of each HTML page. The value NO (the default) enables the index and \n" + "the value YES disables it. \n" + ); + ConfigBool::add( "extractAllFlag", + "EXTRACT_ALL", + "FALSE", + "gererate docs for all classes flag", + "If the EXTRACT_ALL tag is set to YES all classes and functions will be \n" + "included in the documentation, even if no documentation was available. \n" + ); + ConfigBool::add( "extractPrivateFlag", + "EXTRACT_PRIVATE", + "FALSE", + "generate docs for private members flag", + "If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n" + "will be included in the documentation. \n" + ); + ConfigBool::add( "hideMemberFlag", + "HIDE_UNDOC_MEMBERS", + "FALSE", + "hide undocumented members.", + "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n" + "undocumented members inside documented classes or files. \n" + ); + ConfigBool::add( "hideClassFlag", + "HIDE_UNDOC_CLASSES", + "FALSE", + "hide undocumented members.", + "If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all \n" + "undocumented classes. \n" + ); + ConfigBool::add( "briefMemDescFlag", + "BRIEF_MEMBER_DESC", + "TRUE", + "enable `inline' brief member descr.", + "If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n" + "include brief member descriptions after the members that are listed in \n" + "the file and class documentation (similar to JavaDoc). \n" + "Set to NO to disable this. \n" + ); + ConfigBool::add( "repeatBriefFlag", + "REPEAT_BRIEF", + "TRUE", + "repeat brief descriptions.", + "If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n" + "the brief description of a member or function before the detailed description. \n" + "Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n" + "brief descriptions will be completely suppressed. \n" + ); + ConfigBool::add( "alwaysDetailsFlag", + "ALWAYS_DETAILED_SEC", + "FALSE", + "show details description even if there is only a brief description?", + "If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n" + "Doxygen will generate a detailed section even if there is only a brief \n" + "description. \n" + ); + ConfigBool::add( "fullPathNameFlag", + "FULL_PATH_NAMES", + "FALSE", + "using full path name in output", + "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n" + "path before files name in the file list and in the header files. If set \n" + "to NO the shortest path that makes the file name unique will be used. \n" + ); + ConfigList::add( "stripFromPath", + "STRIP_FROM_PATH", + "", + "list of candidates to strip from the file path", + "If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n" + "can be used to strip a user defined part of the path. Stripping is \n" + "only done if one of the specified strings matches the left-hand part of \n" + "the path. \n" + ); + addDependency("stripFromPath","fullPathNameFlag"); + ConfigBool::add( "internalDocsFlag", + "INTERNAL_DOCS", + "FALSE", + "determines what happens to internal docs.", + "The INTERNAL_DOCS tag determines if documentation \n" + "that is typed after a \\internal command is included. If the tag is set \n" + "to NO (the default) then the documentation will be excluded. \n" + "Set it to YES to include the internal documentation. \n" + ); + ConfigBool::add( "classDiagramFlag", + "CLASS_DIAGRAMS", + "TRUE", + "enable the generation of class diagrams.", + "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n" + "generate a class diagram (in Html and LaTeX) for classes with base or \n" + "super classes. Setting the tag to NO turns the diagrams off. \n" + ); + ConfigBool::add( "sourceBrowseFlag", + "SOURCE_BROWSER", + "FALSE", + "include source code in documentation.", + "If the SOURCE_BROWSER tag is set to YES then a list of source files will \n" + "be generated. Documented entities will be cross-referenced with these sources. \n" + ); + ConfigBool::add( "inlineSourceFlag", + "INLINE_SOURCES", + "FALSE", + "inline the definition bodies in the docs?", + "Setting the INLINE_SOURCES tag to YES will include the body \n" + "of functions and classes directly in the documentation. \n" + ); + ConfigBool::add( "stripCommentsFlag", + "STRIP_CODE_COMMENTS", + "TRUE", + "strip special comments from code fragments?", + "Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n" + "doxygen to hide any special comment blocks from generated source code \n" + "fragments. Normal C and C++ comments will always remain visible. \n" + ); + ConfigBool::add( "caseSensitiveNames", + "CASE_SENSE_NAMES", + "FALSE", + "determines if output can be mixed case.", + "If the CASE_SENSE_NAMES tag is set to NO (the default) then Doxygen \n" + "will only generate file names in lower case letters. If set to \n" + "YES upper case letters are also allowed. This is useful if you have \n" + "classes or files whose names only differ in case and if your file system \n" + "supports case sensitive file names. \n" + ); + ConfigBool::add( "verbatimHeaderFlag", + "VERBATIM_HEADERS", + "TRUE", + "enable/disable generation of verb headers.", + "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n" + "will generate a verbatim copy of the header file for each class for \n" + "which an include is specified. Set to NO to disable this. \n" + ); + ConfigBool::add( "showIncFileFlag", + "SHOW_INCLUDE_FILES", + "TRUE", + "show include file in file documentation?", + "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n" + "will put list of the files that are included by a file in the documentation \n" + "of that file. \n" + ); + ConfigBool::add( "autoBriefFlag", + "JAVADOC_AUTOBRIEF", + "TRUE", + "javadoc comments behaves as Qt comments.", + "If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen \n" + "will interpret the first line (until the first dot) of a JavaDoc-style \n" + "comment as the brief description. If set to NO, the Javadoc-style will \n" + "behave just like the Qt-style comments. \n" + ); + ConfigBool::add( "inheritDocsFlag", + "INHERIT_DOCS", + "TRUE", + "inheritance of documentation enabled?", + "If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n" + "member inherits the documentation from any documented member that it \n" + "reimplements. \n" + ); + ConfigBool::add( "inlineInfoFlag", + "INLINE_INFO", + "TRUE", + "show info about inline members?", + "If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n" + "is inserted in the documentation for inline members. \n" + ); + ConfigBool::add( "sortMembersFlag", + "SORT_MEMBER_DOCS", + "TRUE", + "sort members alphabetically?", + "If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n" + "will sort the (detailed) documentation of file and class members \n" + "alphabetically by member name. If set to NO the members will appear in \n" + "declaration order. \n" + ); + ConfigInt::add( "tabSize", + "TAB_SIZE", + "8", + "number of spaces in a tab", + "The TAB_SIZE tag can be used to set the number of spaces in a tab. \n" + "Doxygen uses this value to replace tabs by spaces in code fragments. \n", + 1,16 + ); + ConfigList::add( "sectionFilterList", + "ENABLED_SECTIONS", + "", + "list of section filters that are enabled", + "The ENABLE_SECTIONS tag can be used to enable conditional \n" + "documentation sections, marked by \\if sectionname ... \\endif. \n" + ); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Input","configuration options related to the input files"); + //----------------------------------------------------------------------------------------------- + ConfigList::add( "inputSources", + "INPUT", + "", + "list of input files", + "The INPUT tag can be used to specify the files and/or directories that contain \n" + "documented source files. You may enter file names like \"myfile.cpp\" or \n" + "directories like \"/usr/src/myproject\". Separate the files or directories \n" + "with spaces. \n", + ConfigList::FileAndDir + ); + ConfigList::add( "filePatternList", + "FILE_PATTERNS", + "", + "list of file patterns", + "If the value of the INPUT tag contains directories, you can use the \n" + "FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n" + "and *.h) to filter out the source-files in the directories. If left \n" + "blank all files are included. \n" + ); + ConfigBool::add( "recursiveFlag", + "RECURSIVE", + "FALSE", + "scan directories recursively", + "The RECURSIVE tag can be used to turn specify whether or not subdirectories \n" + "should be searched for input files as well. Possible values are YES and NO. \n" + "If left blank NO is used. \n" + ); + ConfigList::add( "excludeSources", + "EXCLUDE", + "", + "list of files to exclude from the input", + "The EXCLUDE tag can be used to specify files and/or directories that should \n" + "excluded from the INPUT source files. This way you can easily exclude a \n" + "subdirectory from a directory tree whose root is specified with the INPUT tag. \n", + ConfigList::FileAndDir + ); + ConfigList::add( "excludePatternList", + "EXCLUDE_PATTERNS", + "", + "list of patterns to exclude from input", + "If the value of the INPUT tag contains directories, you can use the \n" + "EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n" + "certain files from those directories. \n" + ); + ConfigList::add( "examplePath", + "EXAMPLE_PATH", + "", + "list of example paths", + "The EXAMPLE_PATH tag can be used to specify one or more files or \n" + "directories that contain example code fragments that are included (see \n" + "the \\include command). \n", + ConfigList::Dir + ); + ConfigList::add( "examplePatternList", + "EXAMPLE_PATTERNS", + "", + "list of example patterns", + "If the value of the EXAMPLE_PATH tag contains directories, you can use the \n" + "EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n" + "and *.h) to filter out the source-files in the directories. If left \n" + "blank all files are included. \n" + ); + ConfigList::add( "imagePath", + "IMAGE_PATH", + "", + "list of image paths", + "The IMAGE_PATH tag can be used to specify one or more files or \n" + "directories that contain image that are included in the documentation (see \n" + "the \\image command). \n", + ConfigList::Dir + ); + ConfigString::add("inputFilter", + "INPUT_FILTER", + "", + "a filter command that is applied to input files", + "The INPUT_FILTER tag can be used to specify a program that doxygen should \n" + "invoke to filter for each input file. Doxygen will invoke the filter program \n" + "by executing (via popen()) the command <filter> <input-file>, where <filter> \n" + "is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n" + "input file. Doxygen will then use the output that the filter program writes \n" + "to standard output. \n", + ConfigString::File + ); + + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Index","configuration options related to the alphabetical class index"); + //----------------------------------------------------------------------------------------------- + + ConfigBool::add( "alphaIndexFlag", + "ALPHABETICAL_INDEX", + "FALSE", + "should an alphabetical index be generated?", + "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n" + "of all compounds will be generated. Enable this if the project \n" + "contains a lot of classes, structs, unions or interfaces. \n" + ); + ConfigInt::add( "colsInAlphaIndex", + "COLS_IN_ALPHA_INDEX", + "5", + "number of columns in the alphabetical index", + "If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n" + "the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n" + "in which this list will be split (can be a number in the range [1..20]) \n", + 1,20 + ); + ConfigList::add( "ignorePrefixList", + "IGNORE_PREFIX", + "", + "list of prefixes to ignore for the alphabetical index", + "In case all classes in a project start with a common prefix, all \n" + "classes will be put under the same header in the alphabetical index. \n" + "The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n" + "should be ignored while generating the index headers. \n" + ); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "HTML","configuration options related to the HTML output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateHtml", + "GENERATE_HTML", + "TRUE", + "generate HTML output", + "If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n" + "generate HTML output. \n" + ); + ConfigString::add("htmlOutputDir", + "HTML_OUTPUT", + "html", + "the directory to put the HTML files", + "The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `html' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("htmlOutputDir","generateHtml"); + ConfigString::add("headerFile", + "HTML_HEADER", + "", + "the name of the personal HTML header", + "The HTML_HEADER tag can be used to specify a personal HTML header for \n" + "each generated HTML page. If it is left blank doxygen will generate a \n" + "standard header.\n", + ConfigString::File + ); + addDependency("headerFile","generateHtml"); + ConfigString::add("footerFile", + "HTML_FOOTER", + "", + "the name of the personal HTML footer", + "The HTML_FOOTER tag can be used to specify a personal HTML footer for \n" + "each generated HTML page. If it is left blank doxygen will generate a \n" + "standard footer.\n", + ConfigString::File + ); + addDependency("footerFile","generateHtml"); + ConfigString::add("htmlStyleSheet", + "HTML_STYLESHEET", + "", + "user defined cascading style sheet", + "The HTML_STYLESHEET tag can be used to specify a user defined cascading \n" + "style sheet that is used by each HTML page. It can be used to \n" + "fine-tune the look of the HTML output. If the tag is left blank doxygen \n" + "will generate a default style sheet \n", + ConfigString::File + ); + addDependency("htmlStyleSheet","generateHtml"); + ConfigBool::add( "htmlAlignMemberFlag", + "HTML_ALIGN_MEMBERS", + "TRUE", + "align members in HTML using tables.", + "If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n" + "files or namespaces will be aligned in HTML using tables. If set to \n" + "NO a bullet list will be used. \n" + ); + addDependency("htmlAlignMemberFlag","generateHtml"); + ConfigBool::add( "htmlHelpFlag", + "GENERATE_HTMLHELP", + "FALSE", + "should html help files be generated?", + "If the GENERATE_HTMLHELP tag is set to YES, additional index files \n" + "will be generated that can be used as input for tools like the \n" + "Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n" + "of the generated HTML documentation. \n" + ); + addDependency("htmlHelpFlag","generateHtml"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "LaTeX","configuration options related to the LaTeX output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateLatex", + "GENERATE_LATEX", + "TRUE", + "generate Latex output", + "If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n" + "generate Latex output. \n" + ); + ConfigString::add("latexOutputDir", + "LATEX_OUTPUT", + "latex", + "the directory to put the Latex files", + "The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `latex' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("latexOutputDir","generateLatex"); + ConfigBool::add( "compactLatexFlag", + "COMPACT_LATEX", + "FALSE", + "generate compact LaTeX documentation.", + "If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n" + "LaTeX documents. This may be useful for small projects and may help to \n" + "save some trees in general. \n" + ); + addDependency("compactLatexFlag","generateLatex"); + ConfigString::add("paperType", + "PAPER_TYPE", + "a4wide", + "the page type to generate docs for", + "The PAPER_TYPE tag can be used to set the paper type that is used \n" + "by the printer. Possible values are: a4, a4wide, letter, legal and \n" + "executive. If left blank a4wide will be used. \n" + ); + ConfigString::addFixedValue("paperType","a4"); + ConfigString::addFixedValue("paperType","a4wide"); + ConfigString::addFixedValue("paperType","letter"); + ConfigString::addFixedValue("paperType","legal"); + ConfigString::addFixedValue("paperType","executive"); + addDependency("paperType","generateLatex"); + ConfigList::add( "extraPackageList", + "EXTRA_PACKAGES", + "", + "list of extra LaTeX packages.", + "The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n" + "packages that should be included in the LaTeX output. \n" + ); + addDependency("extraPackageList","generateLatex"); + ConfigString::add("latexHeaderFile", + "LATEX_HEADER", + "", + "the name of the personal LaTeX header", + "The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n" + "the generated latex document. The header should contain everything until \n" + "the first chapter. If it is left blank doxygen will generate a \n" + "standard header. Notice: only use this tag if you know what you are doing! \n", + ConfigString::File + ); + addDependency("latexHeaderFile","generateLatex"); + ConfigBool::add( "pdfHyperFlag", + "PDF_HYPERLINKS", + "FALSE", + "generate latex prepared creating hyperlinked pdfs.", + "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n" + "is prepared for conversion to pdf (using ps2pdf). The pdf file will \n" + "contain links (just like the HTML output) instead of page references \n" + "This makes the output suitable for online browsing using a pdf viewer. \n" + ); + addDependency("pdfHyperFlag","generateLatex"); + ConfigBool::add( "latexBatchModeFlag", + "LATEX_BATCHMODE", + "FALSE", + "continue after latex errors?", + "If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n" + "command to the generated LaTeX files. This will instruct LaTeX to keep \n" + "running if errors occur, instead of asking the user for help. \n" + "This option is also used when generating formulas in HTML. \n" + ); + addDependency("latexBatchModeFlag","generateLatex"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "RTF","configuration options related to the RTF output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateRTF", + "GENERATE_RTF", + "FALSE", + "generate RTF flag", + "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n" + "For now this is experimental and is disabled by default. The RTF output \n" + "is optimised for Word 97 and may not look too pretty with other readers \n" + "or editors.\n" + ); + ConfigString::add("rtfOutputDir", + "RTF_OUTPUT", + "rtf", + "the directory to put the RTF files", + "The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `rtf' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("rtfOutputDir","generateRTF"); + ConfigBool::add( "compactRTFFlag", + "COMPACT_RTF", + "FALSE", + "generate more compact RTF", + "If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n" + "RTF documents. This may be useful for small projects and may help to \n" + "save some trees in general. \n" + ); + addDependency("compactRTFFlag","generateRTF"); + ConfigBool::add( "rtfHyperFlag", + "RTF_HYPERLINKS", + "FALSE", + "generate hyper links in RTF", + "If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n" + "will contain hyperlink fields. The RTF file will \n" + "contain links (just like the HTML output) instead of page references. \n" + "This makes the output suitable for online browsing using a WORD or other. \n" + "programs which support those fields. \n" + "Note: wordpad (write) and others do not support links. \n" + ); + addDependency("rtfHyperFlag","generateRTF"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Man","configuration options related to the man page output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateMan", + "GENERATE_MAN", + "TRUE", + "generate Man pages", + "If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n" + "generate man pages \n" + ); + ConfigString::add("manOutputDir", + "MAN_OUTPUT", + "man", + "the directory to put the man pages", + "The MAN_OUTPUT tag is used to specify where the man pages will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `man' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("manOutputDir","generateMan"); + ConfigString::add("manExtension", + "MAN_EXTENSION", + ".3", + "extension the man page files", + "The MAN_EXTENSION tag determines the extension that is added to \n" + "the generated man pages (default is the subroutine's section .3) \n" + ); + addDependency("manExtension","generateMan"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Preprocessor","Configuration options related to the preprocessor "); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "preprocessingFlag", + "ENABLE_PREPROCESSING", + "TRUE", + "enable preprocessing", + "If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n" + "evaluate all C-preprocessor directives found in the sources and include \n" + "files. \n" + ); + ConfigBool::add( "macroExpansionFlag", + "MACRO_EXPANSION", + "FALSE", + "expand macros in the source.", + "If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n" + "names in the source code. If set to NO (the default) only conditional \n" + "compilation will be performed. \n" + ); + addDependency("macroExpansionFlag","preprocessingFlag"); + ConfigBool::add( "searchIncludeFlag", + "SEARCH_INCLUDES", + "TRUE", + "search for included files", + "If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n" + "in the INCLUDE_PATH (see below) will be search if a #include is found. \n" + ); + addDependency("searchIncludeFlag","preprocessingFlag"); + ConfigList::add( "includePath", + "INCLUDE_PATH", + "", + "list of include paths", + "The INCLUDE_PATH tag can be used to specify one or more directories that \n" + "contain include files that are not input files but should be processed by \n" + "the preprocessor. \n", + ConfigList::Dir + ); + addDependency("includePath","preprocessingFlag"); + ConfigList::add( "predefined", + "PREDEFINED", + "", + "list of predefined macro names.", + "The PREDEFINED tag can be used to specify one or more macro names that \n" + "are defined before the preprocessor is started (similar to the -D option of \n" + "gcc). The argument of the tag is a list of macros of the form: name \n" + "or name=definition (no spaces). If the definition and the = are \n" + "omitted =1 is assumed. \n" + ); + addDependency("predefined","preprocessingFlag"); + ConfigBool::add( "onlyPredefinedFlag", + "EXPAND_ONLY_PREDEF", + "FALSE", + "expand only predefined macros", + "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n" + "then the macro expansion is limited to the macros specified with the \n" + "PREDEFINED tag. \n" + ); + addDependency("onlyPredefinedFlag","preprocessingFlag"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "External","Configuration::addtions related to external references "); + //----------------------------------------------------------------------------------------------- + ConfigList::add( "tagFileList", + "TAGFILES", + "", + "list of tag files", + "The TAGFILES tag can be used to specify one or more tagfiles. \n", + ConfigList::File + ); + ConfigString::add("genTagFile", + "GENERATE_TAGFILE", + "", + "the tag file to generate", + "When a file name is specified after GENERATE_TAGFILE, doxygen will create \n" + "a tag file that is based on the input files it reads. \n", + ConfigString::File + ); + ConfigBool::add( "allExtFlag", + "ALLEXTERNALS", + "FALSE", + "include all external classes flag", + "If the ALLEXTERNALS tag is set to YES all external classes will be listed \n" + "in the class index. If set to NO only the inherited external classes \n" + "will be listed. \n" + ); + ConfigString::add("perlPath", + "PERL_PATH", + "/usr/bin/perl", + "the absolute path to perl", + "The PERL_PATH should be the absolute path and name of the perl script \n" + "interpreter (i.e. the result of `which perl'). \n", + ConfigString::Dir + ); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Dot","Configuration options related to the dot tool "); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "haveDotFlag", + "HAVE_DOT", + "FALSE", + "indicates wether or not dot is present", + "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n" + "available from the path. This tool is part of Graphviz, a graph visualization \n" + "toolkit from AT&T and Lucent Bell Labs. The other options in this section \n" + "have no effect if this option is set to NO (the default) \n" + ); + ConfigBool::add( "collGraphFlag", + "COLLABORATION_GRAPH", + "TRUE", + "collaboration graph", + "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n" + "will generate a graph for each documented class showing the direct and \n" + "indirect implementation dependencies (inheritance, containment, and \n" + "class references variables) of the class with other documented classes. \n" + ); + addDependency("collGraphFlag","haveDotFlag"); + ConfigBool::add( "includeGraphFlag", + "INCLUDE_GRAPH", + "TRUE", + "include graph", + "If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to \n" + "YES then doxygen will generate a graph for each documented file showing \n" + "the direct and indirect include dependencies of the file with other \n" + "documented files. \n" + ); + addDependency("includeGraphFlag","haveDotFlag"); + ConfigBool::add( "gfxHierarchyFlag", + "GRAPHICAL_HIERARCHY", + "TRUE", + "flag to enable graphical hierarchy", + "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n" + "will graphical hierarchy of all classes instead of a textual one. \n" + ); + addDependency("gfxHierarchyFlag","haveDotFlag"); + + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Search","Configuration::addtions related to the search engine "); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "searchEngineFlag", + "SEARCHENGINE", + "FALSE", + "generate search engine flag", + "The SEARCHENGINE tag specifies whether or not a search engine should be \n" + "used. If set to NO the values of all tags below this one will be ignored. \n" + ); + ConfigString::add("cgiName", + "CGI_NAME", + "search.cgi", + "the name of the CGI binary", + "The CGI_NAME tag should be the name of the CGI script that \n" + "starts the search engine (doxysearch) with the correct parameters. \n" + "A script with this name will be generated by doxygen. \n" + ); + addDependency("cgiName","searchEngineFlag"); + ConfigString::add("cgiURL", + "CGI_URL", + "", + "the absolute URL to the CGI binary", + "The CGI_URL tag should be the absolute URL to the directory where the \n" + "cgi binaries are located. See the documentation of your http daemon for \n" + "details. \n" + ); + addDependency("cgiURL","searchEngineFlag"); + ConfigString::add("docURL", + "DOC_URL", + "", + "the absolute URL to the documentation", + "The DOC_URL tag should be the absolute URL to the directory where the \n" + "documentation is located. If left blank the absolute path to the \n" + "documentation, with file:// prepended to it, will be used. \n" + ); + addDependency("docURL","searchEngineFlag"); + ConfigString::add("docAbsPath", + "DOC_ABSPATH", + "", + "the absolute path to the documentation", + "The DOC_ABSPATH tag should be the absolute path to the directory where the \n" + "documentation is located. If left blank the directory on the local machine \n" + "will be used. \n", + ConfigString::Dir + ); + addDependency("docAbsPath","searchEngineFlag"); + ConfigString::add("binAbsPath", + "BIN_ABSPATH", + "/usr/local/bin/", + "the absolute path to the doxysearch", + "The BIN_ABSPATH tag must point to the directory where the doxysearch binary \n" + "is installed. \n", + ConfigString::Dir + ); + addDependency("binAbsPath","searchEngineFlag"); + ConfigList::add( "extDocPathList", + "EXT_DOC_PATHS", + "", + "list of external doc. directories.", + "The EXT_DOC_PATHS tag can be used to specify one or more paths to \n" + "documentation generated for other projects. This allows doxysearch to search \n" + "the documentation for these projects as well. \n", + ConfigList::Dir + ); + addDependency("extDocPathList","searchEngineFlag"); + + // The IMAGE_PATTERNS tag is now officially obsolete. + //----------------------------------------------------------------------------------------------- + //ConfigInfo::add("not used"); + //----------------------------------------------------------------------------------------------- + //ConfigList::add("imagePatternList", + // "IMAGE_PATTERNS", + // "", + // "list of image paths", + // "don´t know\n"); +} diff --git a/addon/configgen/configgen.pro.in b/addon/configgen/configgen.pro.in new file mode 100644 index 0000000..26b9c51 --- /dev/null +++ b/addon/configgen/configgen.pro.in @@ -0,0 +1,20 @@ +# +# +# +# Copyright (C) 1997-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. +# +# TMake project file for configgen + +TEMPLATE = app.t +CONFIG = console qt warn_on $extraopts +HEADERS = +SOURCES = configgen.cpp +win32:INCLUDEPATH += . +TARGET = bin/configgen +OBJECTS_DIR = obj diff --git a/addon/configgen/qtbc.h b/addon/configgen/qtbc.h new file mode 100644 index 0000000..d03672f --- /dev/null +++ b/addon/configgen/qtbc.h @@ -0,0 +1,43 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-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. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#ifndef QTBC_H +#define QTBC_H + +/*! This file contains some hacks to make Doxygen work with + * Qt version 2.00 and Qt version 1.xx + */ + +#include <qglobal.h> + +#if QT_VERSION >= 200 + +#define GCI QCollection::Item + +#include <qcstring.h> +#include <qstring.h> +inline QCString convertToQCString(const QString &s) { return s.local8Bit(); } + +#else /* QT_VERSION < 200 */ + +#include <qstring.h> +#define QCString QString +inline QCString convertToQCString(const QCString &s) { return s; } + +#endif + +#endif diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in new file mode 100644 index 0000000..4e8779b --- /dev/null +++ b/addon/doxywizard/Makefile.in @@ -0,0 +1,52 @@ +# +# +# +# Copyright (C) 1997-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. +# + +CFGGENBIN_DIR = ../configgen/bin +CFGGENSRC_DIR = ../configgen + +all: $(CFGGENBIN_DIR)/configgen config.h config.l doxywizard.cpp doxywizard.h \ + Makefile.doxywizard + $(MAKE) -f Makefile.doxywizard $@ + +Makefile.doxywizard: doxywizard.pro doxywizard.t + $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard + +config.l: $(CFGGENBIN_DIR)/configgen $(CFGGENSRC_DIR)/config_templ.l + $(CFGGENBIN_DIR)/configgen $(CFGGENSRC_DIR)/config_templ.l >config.l + +config.h: $(CFGGENBIN_DIR)/configgen $(CFGGENSRC_DIR)/config_templ.h + $(CFGGENBIN_DIR)/configgen $(CFGGENSRC_DIR)/config_templ.h >config.h + +doxywizard.cpp: $(CFGGENBIN_DIR)/configgen doxywizard_templ.cpp + $(CFGGENBIN_DIR)/configgen doxywizard_templ.cpp >doxywizard.cpp + +doxywizard.h: $(CFGGENBIN_DIR)/configgen doxywizard_templ.h + $(CFGGENBIN_DIR)/configgen doxywizard_templ.h >doxywizard.h + +$(CFGGENBIN_DIR)/configgen: $(CFGGENSRC_DIR)/configgen.cpp + $(MAKE) -C $(CFGGENSRC_DIR) + +tmake: + $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard + +clean: Makefile.doxywizard + $(MAKE) -f Makefile.doxywizard clean + +distclean: clean + $(RM) doxywizard.cpp doxywizard.h \ + config.l config.h config.cpp Makefile.doxywizard + +install: + $(INSTTOOL) -d $(INSTALL)/bin + $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin + +FORCE: diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in new file mode 100644 index 0000000..36b9639 --- /dev/null +++ b/addon/doxywizard/doxywizard.pro.in @@ -0,0 +1,52 @@ +# +# +# +# Copyright (C) 1997-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. +# +# project file for the doxywizard project + +# special template configuration file because we use flex +TEMPLATE = doxywizard.t + +# executable to generate +TARGET = ../../bin/doxywizard + +# configure options +CONFIG = qt warn_on $extraopts + +# header file for the project +HEADERS = doxywizard.h \ + config.h \ + version.h \ + pagewidget.h \ + inputstring.h \ + inputbool.h \ + inputstrlist.h \ + inputint.h \ + pixmaps.h + +# source flle for the project +SOURCES = doxywizard.cpp \ + config.cpp \ + version.cpp \ + pagewidget.cpp \ + inputstring.cpp \ + inputbool.cpp \ + inputstrlist.cpp \ + inputint.cpp \ + pixmaps.cpp + +# where to put the objects +OBJECTS_DIR = obj + +# where to put the intermediate moc stuff +MOC_DIR = moc + +# extra C++ compiler options +TMAKE_CXXFLAGS = -DDOXYWIZARD diff --git a/addon/doxywizard/doxywizard.t b/addon/doxywizard/doxywizard.t new file mode 100644 index 0000000..bebb1be --- /dev/null +++ b/addon/doxywizard/doxywizard.t @@ -0,0 +1,45 @@ +# +# +# +# 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. +#! +#! wizard.t: This is a custom template for building doxywizard +#! +#$ IncludeTemplate("app.t"); + +LEX = flex +YACC = bison + +#${ +sub GenerateDep { + my($obj,$src,$dep) = @_; + my(@objv,$srcv,$i,$s,$o,$d,$c); + @objv = split(/\s+/,$obj); + @srcv = split(/\s+/,$src); + for $i ( 0..$#objv ) { + $s = $srcv[$i]; + $o = $objv[$i]; + next if $s eq ""; + $text .= $o . ": " . $s; + $text .= " ${linebreak}\n\t\t" . $dep if $dep ne ""; + if ( $moc_output{$s} ne "" ) { + $text .= " ${linebreak}\n\t\t" . $moc_output{$s}; + } + $d = &make_depend($s); + $text .= " ${linebreak}\n\t\t" . $d if $d ne ""; + $text .= "\n"; + } + chop $text; +} +#$} + +#################### + +#$ GenerateDep("config.cpp","config.l"); + $(LEX) -PconfigYY -t config.l >config.cpp diff --git a/addon/doxywizard/doxywizard_templ.cpp b/addon/doxywizard/doxywizard_templ.cpp new file mode 100644 index 0000000..4ec430d --- /dev/null +++ b/addon/doxywizard/doxywizard_templ.cpp @@ -0,0 +1,348 @@ +/****************************************************************************** + * + * + * + * 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 <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); + 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 ); + +#CONFIG Widgets0 +#CONFIG Widgets1 + +} + +ConfigFile::~ConfigFile() +{ +} + +#CONFIG WidgetSlotImpl + +void ConfigFile::init() +{ +#CONFIG WidgetInit +} + +//---------------------------------------------------------------------- + +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(); +} diff --git a/addon/doxywizard/doxywizard_templ.h b/addon/doxywizard/doxywizard_templ.h new file mode 100644 index 0000000..e0c228e --- /dev/null +++ b/addon/doxywizard/doxywizard_templ.h @@ -0,0 +1,75 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ + +#ifndef _DOXWIZARD_H +#define _DOXWIZARD_H + +#include <qmainwindow.h> + +class QToolBar; +class ConfigFile; +class InputBool; +class InputString; +class InputStrList; +class InputFile; +class InputDir; +class InputInt; + +class Wizard : public QMainWindow +{ + Q_OBJECT + + public: + Wizard(int argc,char **argv); + ~Wizard(){}; + void loadFile(const char *s); + + private slots: + void newFile(); + void loadFile(); + void saveFile(); + void saveAsFile(); + void quit(); + void changed(); + void about(); + + signals: + + private: + void refreshCaption(); + QToolBar *fileTools; + bool hasChanged; + ConfigFile *cw; +}; + +class ConfigFile : public QWidget +{ + Q_OBJECT + + public: + ConfigFile(QWidget *parent=0); + ~ConfigFile(); + void init(); + + signals: + void changed(); + + private slots: +#CONFIG WidgetSlots + + private: +#CONFIG WidgetVars +}; + +#endif diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp new file mode 100644 index 0000000..b0db14b --- /dev/null +++ b/addon/doxywizard/inputbool.cpp @@ -0,0 +1,42 @@ +/****************************************************************************** + * + * + * + * 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 "inputbool.h" +#include "pagewidget.h" +#include <qwindowsstyle.h> + +InputBool::InputBool( const QString & text, PageWidget * parent, bool &flag ) + : QCheckBox( text, parent->getLayout() ), state(flag) +{ + QWindowsStyle *winStyle = new QWindowsStyle(); + setChecked( flag ); + setStyle( winStyle ); + setMinimumSize( sizeHint() ); + + connect( this, SIGNAL(toggled(bool)), SLOT(setState(bool)) ); + + parent->addWidget(this); +} + +void InputBool::init() +{ + setChecked(state); +} + +void InputBool::setState( bool s ) +{ + if (state!=s) emit changed(); + state=s; +} + diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h new file mode 100644 index 0000000..9102be7 --- /dev/null +++ b/addon/doxywizard/inputbool.h @@ -0,0 +1,42 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ + +#ifndef _INPUTBOOL_H +#define _INPUTBOOL_H + +#include <qcheckbox.h> + +class PageWidget; + +class InputBool : public QCheckBox +{ + Q_OBJECT + + public: + InputBool( const QString &text, PageWidget *parent, bool &flag ); + ~InputBool(){}; + void init(); + + signals: + void changed(); + + private slots: + void setState(bool); + + private: + bool &state; + +}; + +#endif diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp new file mode 100644 index 0000000..54d7d02 --- /dev/null +++ b/addon/doxywizard/inputint.cpp @@ -0,0 +1,67 @@ +/****************************************************************************** + * + * + * + * 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 "inputint.h" +#include "pagewidget.h" + +#include <stdio.h> +#include <stdlib.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qwindowsstyle.h> +#include <qspinbox.h> + +InputInt::InputInt( const QString & label, PageWidget *parent, int &val, int minVal,int maxVal ) + : QWidget( parent->getLayout() ), m_val(val), m_minVal(minVal), m_maxVal(maxVal) +{ + QHBoxLayout *layout = new QHBoxLayout( this, 5 ); + + lab = new QLabel( label, this ); + lab->setMinimumSize( lab->sizeHint() ); + + sp = new QSpinBox( minVal,maxVal,1,this ); + sp->setMinimumSize( sp->sizeHint() ); + + init(); + + layout->addWidget( lab ); + layout->addWidget( sp ); + layout->addStretch(1); + layout->activate(); + setMinimumSize( sizeHint() ); + + connect(sp, SIGNAL(valueChanged(int)), + this, SLOT(valueChanged(int)) ); + + parent->addWidget(this); +} + +void InputInt::valueChanged(int val) +{ + if (val!=m_val) emit changed(); + m_val = val; +} + +void InputInt::setEnabled(bool state) +{ + lab->setEnabled(state); + sp->setEnabled(state); +} + +void InputInt::init() +{ + m_val = QMAX(m_minVal,m_val); + m_val = QMIN(m_maxVal,m_val); + sp->setValue(m_val); +} diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h new file mode 100644 index 0000000..ad6d2de --- /dev/null +++ b/addon/doxywizard/inputint.h @@ -0,0 +1,51 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ + +#ifndef _INPUTINT_H +#define _INPUTINT_H + +#include <qwidget.h> +#include <qstring.h> + +class QLabel; +class QSpinBox; +class PageWidget; + +class InputInt : public QWidget +{ + Q_OBJECT + + public: + InputInt( const QString &text, PageWidget *parent, int &val, + int minVal, int maxVal ); + ~InputInt(){}; + void setEnabled(bool); + void init(); + + private: + QLabel *lab; + QSpinBox *sp; + int &m_val; + int m_minVal; + int m_maxVal; + + signals: + void changed(); + + private slots: + void valueChanged(int val); + +}; + +#endif diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp new file mode 100644 index 0000000..2895a18 --- /dev/null +++ b/addon/doxywizard/inputstring.cpp @@ -0,0 +1,184 @@ +/****************************************************************************** + * + * + * + * 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 "inputstring.h" +#include "pagewidget.h" +#include "pixmaps.h" + +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qwindowsstyle.h> +#include <qcstring.h> +#include <qpushbutton.h> +#include <qfiledialog.h> +#include <qcombobox.h> +#include <qtooltip.h> + + +InputString::InputString( const QString & label, + PageWidget *parent, QCString &s, StringMode m ) + : QWidget( parent->getLayout() ), str(s), sm(m), m_values(0), m_index(0) +{ + if (m==StringFixed) + { + QHBoxLayout *layout = new QHBoxLayout( this, 5); + lab = new QLabel( label, this ); + lab->setMinimumSize( lab->sizeHint() ); + layout->addWidget( lab ); + com = new QComboBox( this ); + layout->addWidget( com ); + layout->addStretch( 1 ); + le=0; + br=0; + layout->activate(); + setMinimumSize( sizeHint() ); + } + else + { + QGridLayout *layout = new QGridLayout( this, 1, m==StringFree ? 1 : 3, 5 ); + lab = new QLabel( label, this ); + lab->setMinimumSize( lab->sizeHint() ); + layout->addWidget( lab,0,0 ); + le = new QLineEdit( this ); + le->setMinimumSize( le->sizeHint() ); + le->setText( s ); + layout->addWidget( le,0,1 ); + if (m==StringFile || m==StringDir) + { + QPixmap pixmap = QPixmap(m==StringFile ? + file_xpm : + folder_xpm ); + br = new QPushButton( this ); + br->setPixmap(pixmap); + br->setMinimumSize( br->sizeHint() ); + if (m==StringFile) + QToolTip::add(br,"Browse to a file"); + else + QToolTip::add(br,"Browse to a folder"); + layout->addWidget( br,0,2 ); + } + else + { + br=0; + } + com=0; + layout->activate(); + setMinimumSize( sizeHint() ); + } + + if (le) connect( le, SIGNAL(textChanged(const QString&)), + this, SLOT(textChanged(const QString&)) ); + if (br) connect( br, SIGNAL(clicked()), this, SLOT(browse()) ); + if (com) connect( com, SIGNAL(activated(const QString &)), + this, SLOT(textChanged(const QString &)) ); + + parent->addWidget(this); +} + +InputString::~InputString() +{ + if (m_values) delete m_values; +} + + +void InputString::textChanged(const QString &s) +{ + if (str!=(const char *)s) + { + str = s; + emit changed(); + } +} + +void InputString::setEnabled(bool state) +{ + lab->setEnabled(state); + if (le) le->setEnabled(state); + if (br) br->setEnabled(state); + if (com) com->setEnabled(state); +} + +void InputString::browse() +{ + if (sm==StringFile) + { + QString fileName = QFileDialog::getOpenFileName(); + + if (!fileName.isNull()) + { + le->setText( fileName ); + if (str!=(const char *)le->text()) + { + str = le->text(); + emit changed(); + } + } + } + else // sm==StringDir + { + QString dirName = QFileDialog::getExistingDirectory(); + + if (!dirName.isNull()) + { + le->setText( dirName ); + if (str!=(const char *)le->text()) + { + str = le->text(); + emit changed(); + } + } + } +} + +void InputString::clear() +{ + le->setText(""); + if (!str.isEmpty()) + { + emit changed(); + str = ""; + } +} + +void InputString::addValue(const char *s) +{ + if (sm==StringFixed) + { + if (m_values==0) m_values = new QDict<int>; + m_values->setAutoDelete(TRUE); + m_values->insert(s,new int(m_index++)); + com->insertItem(s); + } +} + +void InputString::init() +{ + if (sm==StringFixed) + { + int *itemIndex = m_values->find(str); + if (itemIndex) + { + com->setCurrentItem(*itemIndex); + } + else + { + com->setCurrentItem(0); + } + } + else + { + le->setText(str); + } +} diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h new file mode 100644 index 0000000..5928b80 --- /dev/null +++ b/addon/doxywizard/inputstring.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ + +#ifndef _INPUTSTRING_H +#define _INPUTSTRING_H + +#include <qwidget.h> +#include <qstring.h> +#include <qdict.h> + +class QLabel; +class QLineEdit; +class QPushButton; +class QComboBox; +class PageWidget; + +class InputString : public QWidget +{ + Q_OBJECT + + public: + enum StringMode { StringFree=0, + StringFile=1, + StringDir=2, + StringFixed=3 + }; + + InputString( const QString &text, PageWidget *parent, QCString &s, + StringMode m=StringFree ); + ~InputString(); + void setEnabled(bool); + void addValue(const char *s); + void init(); + + private: + QLabel *lab; + QLineEdit *le; + QPushButton *br; + QComboBox *com; + QCString &str; + StringMode sm; + QDict<int> *m_values; + int m_index; + + signals: + void changed(); + + private slots: + void textChanged(const QString&); + void browse(); + void clear(); + +}; + +#endif diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp new file mode 100644 index 0000000..60bc4bf --- /dev/null +++ b/addon/doxywizard/inputstrlist.cpp @@ -0,0 +1,210 @@ +/****************************************************************************** + * + * + * + * 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 "inputstrlist.h" +#include "pagewidget.h" +#include "pixmaps.h" + +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qpushbutton.h> +#include <qlistbox.h> +#include <qstrlist.h> +#include <qstringlist.h> +#include <qfiledialog.h> +#include <qtooltip.h> + +InputStrList::InputStrList( const QString & label, + PageWidget *parent, QStrList &sl, ListMode lm) + : QWidget(parent->getLayout()), strList(sl) +{ + QGridLayout *layout = new QGridLayout( this, 2, 2, 5 ); + lab = new QLabel( label, this ); + lab->setMinimumSize( lab->sizeHint() ); + layout->addWidget( lab,0,0 ); + + QWidget *dw = new QWidget(this); /* dummy widget used for layouting */ + QHBoxLayout *boxlayout = new QHBoxLayout( dw, 0, 5 ); + le = new QLineEdit( dw ); + le->setMinimumSize( le->sizeHint() ); + boxlayout->addWidget( le, 1 ); + + add = new QPushButton( dw ); + add->setPixmap( QPixmap( add_xpm )); + add->setMinimumSize( add->sizeHint() ); + QToolTip::add(add,"Add item"); + boxlayout->addWidget( add ); + + del = new QPushButton( dw ); + del->setPixmap( QPixmap( del_xpm )); + del->setMinimumSize( del->sizeHint() ); + QToolTip::add(del,"Delete selected item"); + boxlayout->addWidget( del ); + + upd = new QPushButton( dw ); + upd->setPixmap( QPixmap( update_xpm )); + upd->setMinimumSize( upd->sizeHint() ); + QToolTip::add(upd,"Update selected item"); + boxlayout->addWidget( upd ); + + lb = new QListBox( this ); + lb->setMinimumSize(400,100); + init(); + lb->setVScrollBarMode(QScrollView::Auto); + lb->setHScrollBarMode(QScrollView::Auto); + + brFile=0; + brDir=0; + if (lm!=ListString) + { + if (lm&ListFile) + { + brFile = new QPushButton(dw); + brFile->setPixmap( QPixmap(file_xpm) ); + brFile->setMinimumSize(brFile->sizeHint()); + QToolTip::add(brFile,"Browse to a file"); + boxlayout->addWidget( brFile ); + } + if (lm&ListDir) + { + brDir = new QPushButton(dw); + brDir->setPixmap( QPixmap(folder_xpm) ); + brDir->setMinimumSize(brDir->sizeHint()); + QToolTip::add(brDir,"Browse to a folder"); + boxlayout->addWidget( brDir ); + } + } + layout->addWidget( dw, 0,1 ); + layout->addWidget( lb,1,1 ); + layout->activate(); + setMinimumSize( sizeHint() ); + + connect(le, SIGNAL(returnPressed()), + this, SLOT(addString()) ); + connect(add, SIGNAL(clicked()), + this, SLOT(addString()) ); + connect(del, SIGNAL(clicked()), + this, SLOT(delString()) ); + connect(upd, SIGNAL(clicked()), + this, SLOT(updateString()) ); + if (brFile) + { + connect(brFile, SIGNAL(clicked()), + this, SLOT(browseFiles())); + } + if (brDir) + { + connect(brDir, SIGNAL(clicked()), + this, SLOT(browseDir())); + } + connect(lb, SIGNAL(selected(const QString &)), + this, SLOT(selectText(const QString &))); + + parent->addWidget(this); + + strList=sl; +} + +void InputStrList::addString() +{ + if (!le->text().isEmpty()) + { + lb->insertItem(le->text()); + strList.append(le->text()); + emit changed(); + le->clear(); + } +} + +void InputStrList::delString() +{ + if (lb->currentItem()!=-1) + { + int itemIndex = lb->currentItem(); + lb->removeItem(itemIndex); + strList.remove(itemIndex); + emit changed(); + } +} + +void InputStrList::updateString() +{ + if (lb->currentItem()!=-1 && !le->text().isEmpty()) + { + lb->changeItem(le->text(),lb->currentItem()); + strList.insert(lb->currentItem(),le->text()); + strList.remove(lb->currentItem()+1); + emit changed(); + } +} + +void InputStrList::selectText(const QString &s) +{ + le->setText(s); +} + +void InputStrList::setEnabled(bool state) +{ + lab->setEnabled(state); + le->setEnabled(state); + add->setEnabled(state); + del->setEnabled(state); + upd->setEnabled(state); + lb->setEnabled(state); + if (brFile) brFile->setEnabled(state); + if (brDir) brDir->setEnabled(state); +} + +void InputStrList::browseFiles() +{ + QStringList fileNames = QFileDialog::getOpenFileNames(); + + if (!fileNames.isEmpty()) + { + QStringList::Iterator it; + for ( it= fileNames.begin(); it != fileNames.end(); ++it ) + { + lb->insertItem(*it); + strList.append(*it); + emit changed(); + } + le->setText(*fileNames.begin()); + } +} + +void InputStrList::browseDir() +{ + QString dirName = QFileDialog::getExistingDirectory(); + + if (!dirName.isNull()) + { + lb->insertItem(dirName); + strList.append(dirName); + emit changed(); + le->setText(dirName); + } +} + +void InputStrList::init() +{ + le->clear(); + lb->clear(); + char *s = strList.first(); + while (s) + { + lb->insertItem(s); + s = strList.next(); + } +} diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h new file mode 100644 index 0000000..496aeed --- /dev/null +++ b/addon/doxywizard/inputstrlist.h @@ -0,0 +1,69 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ + +#ifndef _INPUTSTRLIST_H +#define _INPUTSTRLIST_H + +#include <qwidget.h> +#include <qstring.h> + +class QLabel; +class QLineEdit; +class QPushButton; +class QListBox; +class PageWidget; +class QStrList; + +class InputStrList : public QWidget +{ + Q_OBJECT + + public: + enum ListMode { ListString=0, + ListFile=1, + ListDir=2, + ListFileDir=ListFile|ListDir + }; + + InputStrList( const QString &text, PageWidget *parent, + QStrList &sl, ListMode v=ListString ); + ~InputStrList() {}; + void setEnabled(bool); + void init(); + + private: + QLabel *lab; + QLineEdit *le; + QPushButton *add; + QPushButton *del; + QPushButton *upd; + QPushButton *brFile; + QPushButton *brDir; + QListBox *lb; + QStrList &strList; + + signals: + void changed(); + + private slots: + void addString(); + void delString(); + void updateString(); + void selectText(const QString &s); + void browseFiles(); + void browseDir(); + +}; + +#endif diff --git a/addon/doxywizard/pagewidget.cpp b/addon/doxywizard/pagewidget.cpp new file mode 100644 index 0000000..48ab092 --- /dev/null +++ b/addon/doxywizard/pagewidget.cpp @@ -0,0 +1,86 @@ +/****************************************************************************** + * + * + * + * 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 <qtabwidget.h> +#include <qlayout.h> +#include "pagewidget.h" + +FrameLayout::FrameLayout(QWidget *parent,const char *name,WFlags f) + : QFrame(parent,name,f) +{ + lay = new QVBoxLayout(this,5,3,name); +} + +FrameLayout::~FrameLayout() +{ +} + +void FrameLayout::addStretch(int stretch) +{ + lay->addStretch(stretch); +} + +void FrameLayout::addWidget(QWidget *w) +{ + lay->addWidget(w); +} + +PageWidget::PageWidget( QTabWidget *parent, const char *name ) + : QScrollView ( parent,name ) +{ + // the Qt docs say that one has to insert the viewport() as a parent + // here but this does not work! Insert 0 does give the proper result! + lay = new FrameLayout(this); + addChild(lay); + setVScrollBarMode(QScrollView::Auto); + setHScrollBarMode(QScrollView::AlwaysOff); + m_parent=parent; + m_parent->addTab( this, name ); +} + +void PageWidget::addStretch(int stretch=0) +{ + lay->addStretch(stretch); + //printf("Viewport SizeHint %d,%d\n",viewport()->sizeHint().width(),viewport()->sizeHint().height()); +} + +void PageWidget::addWidget(QWidget *w) +{ + //printf("Adding widget height=%d\n",w->sizeHint().height()); + lay->addWidget(w); +} + +QWidget *PageWidget::getLayout() const +{ + return lay; +} + +void PageWidget::resizeEvent(QResizeEvent *e) +{ + QScrollView::resizeEvent(e); + //printf("PageWidget::resizeEvent!\n"); + lay->resize(viewport()->width(),QMAX(lay->height(),viewport()->height())); +} + +void PageWidget::paintEvent(QPaintEvent *e) +{ + QScrollView::paintEvent(e); + //printf("PageWidget::paintEvent()\n"); + lay->resize(viewport()->width(),QMAX(lay->height(),viewport()->height())); +} + + + diff --git a/addon/doxywizard/pagewidget.h b/addon/doxywizard/pagewidget.h new file mode 100644 index 0000000..1f188ad --- /dev/null +++ b/addon/doxywizard/pagewidget.h @@ -0,0 +1,63 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ + +#ifndef _PAGEWIDGET_H +#define _PAGEWIDGET_H + +#include <qscrollview.h> + +class QTabWidget; +class QVBoxLayout; + +class FrameLayout : public QFrame +{ + Q_OBJECT + + public: + FrameLayout(QWidget *parent=0, const char *name=0, WFlags g=0); + ~FrameLayout(); + void addStretch(int s=0); + void addWidget(QWidget *w); + + private: + QVBoxLayout *lay; +}; + +class PageWidget : public QScrollView +{ + Q_OBJECT + + public: + PageWidget( QTabWidget *parent, const char *name ); + ~PageWidget() {}; + //void frameChanged() + //{ + // if (!layout()) return; + // layout()->setMargin(frameWidth()); + //} + void addStretch(int stretch=0); + void addWidget(QWidget *w); + QWidget *getLayout() const; + + protected: + void resizeEvent(QResizeEvent *e); + void paintEvent(QPaintEvent *e); + + private: + FrameLayout *lay; + QTabWidget *m_parent; + +}; + +#endif diff --git a/addon/doxywizard/pixmaps.cpp b/addon/doxywizard/pixmaps.cpp new file mode 100644 index 0000000..e3631c5 --- /dev/null +++ b/addon/doxywizard/pixmaps.cpp @@ -0,0 +1,204 @@ +/****************************************************************************** + * + * + * + * 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 "pixmaps.h" + +static const char * const folder_xpm_data[] = +{ + "16 16 6 1", + ". c None", + "b c #ffff00", + "d c #000000", + "* c #999999", + "a c #cccccc", + "c c #ffffff", + "................", + "................", + "..*****.........", + ".*ababa*........", + "*abababa******..", + "*cccccccccccc*d.", + "*cbababababab*d.", + "*cabababababa*d.", + "*cbababababab*d.", + "*cabababababa*d.", + "*cbababababab*d.", + "*cabababababa*d.", + "*cbababababab*d.", + "**************d.", + ".dddddddddddddd.", + "................" +}; +const char **folder_xpm = (const char **)folder_xpm_data; + +static const char* const file_xpm_data[] = +{ + "16 16 5 1", + ". c #7f7f7f", + "# c None", + "c c #000000", + "b c #bfbfbf", + "a c #ffffff", + "################", + "#..........#####", + "#.aaaaaaaab.####", + "#.aaaaaaaaba.###", + "#.aaaaaaaacccc##", + "#.aaaaaaaaaabc##", + "#.aaaaaaaaaabc##", + "#.aaaaaaaaaabc##", + "#.aaaaaaaaaabc##", + "#.aaaaaaaaaabc##", + "#.aaaaaaaaaabc##", + "#.aaaaaaaaaabc##", + "#.aaaaaaaaaabc##", + "#.bbbbbbbbbbbc##", + "#ccccccccccccc##", + "################" +}; +const char **file_xpm = (const char **)file_xpm_data; + +static const char * const add_xpm_data[] = +{ + "16 16 5 1", + ". c None", + "* c #0328f9", + "# c #354396", + "a c #353740", + "c c #999999", + "................", + "......###.......", + "......#*ac......", + "......#*ac......", + "......#*ac......", + "......#*ac......", + ".######*a#####..", + ".#***********ac.", + ".#aaaaa*aaaaaac.", + "..cccc#*acccccc.", + "......#*ac......", + "......#*ac......", + "......#*ac......", + "......#aac......", + ".......ccc......", + "................" +}; +const char **add_xpm = (const char **)add_xpm_data; + +static const char * const del_xpm_data[] = +{ + "16 16 5 1", + ". c None", + "* c #0328f9", + "# c #354396", + "a c #353740", + "c c #999999", + "................", + "................", + "................", + "................", + "................", + "................", + ".#############..", + ".#***********ac.", + ".aaaaaaaaaaaaac.", + "..ccccccccccccc.", + "................", + "................", + "................", + "................", + "................", + "................" +}; +const char **del_xpm = (const char **)del_xpm_data; + +static char *update_xpm_data[] = +{ + "16 16 5 1", + /* colors */ + ". c #0328f9", + "# c #354396", + "a c #353740", + "b c None", + "c c #999999", + /* pixels */ + "bbbbbbbbbbbbbbbb", + "bbbbbbbb#####acb", + "bbbbbbbb#....abb", + "bbc##cbb#...acbb", + "bb#..abb#....abb", + "bc#..abb#.a..acb", + "b#..acbbaac#..ab", + "b#..abbbcbb#..ab", + "b#..abbbbbb#..ab", + "b#..acbbbbc#..ab", + "bc#..#cbbc#..acb", + "bb#...####...acb", + "bbca........acbb", + "bbbbaa....aaccbb", + "bbbbbcaaaaccbbbb", + "bbbbbbbbbbbbbbbb" +}; +const char **update_xpm = (const char **)update_xpm_data; + + +static const char *fileopen_xpm_data[] = +{ + "16 13 5 1", + ". c #040404", + "# c #808304", + "a c None", + "b c #f3f704", + "c c #f3f7f3", + "aaaaaaaaa...aaaa", + "aaaaaaaa.aaa.a.a", + "aaaaaaaaaaaaa..a", + "a...aaaaaaaa...a", + ".bcb.......aaaaa", + ".cbcbcbcbc.aaaaa", + ".bcbcbcbcb.aaaaa", + ".cbcb...........", + ".bcb.#########.a", + ".cb.#########.aa", + ".b.#########.aaa", + "..#########.aaaa", + "...........aaaaa" +}; +const char **fileopen_xpm = (const char **)fileopen_xpm_data; + +/* XPM */ +static const char *filesave_xpm_data[] = +{ + "14 14 4 1", + ". c #040404", + "# c #808304", + "a c #bfc2bf", + "b c None", + "..............", + ".#.aaaaaaaa.a.", + ".#.aaaaaaaa...", + ".#.aaaaaaaa.#.", + ".#.aaaaaaaa.#.", + ".#.aaaaaaaa.#.", + ".#.aaaaaaaa.#.", + ".##........##.", + ".############.", + ".##.........#.", + ".##......aa.#.", + ".##......aa.#.", + ".##......aa.#.", + "b............." +}; +const char **filesave_xpm = (const char **)filesave_xpm_data; + diff --git a/addon/doxywizard/pixmaps.h b/addon/doxywizard/pixmaps.h new file mode 100644 index 0000000..6c0bb97 --- /dev/null +++ b/addon/doxywizard/pixmaps.h @@ -0,0 +1,26 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ + +#ifndef _PIXMAPS_H +#define _PIXMAPS_H + +extern const char** folder_xpm; +extern const char** file_xpm; +extern const char** add_xpm; +extern const char** del_xpm; +extern const char** update_xpm; +extern const char** fileopen_xpm; +extern const char** filesave_xpm; + +#endif diff --git a/addon/doxywizard/version.cpp b/addon/doxywizard/version.cpp new file mode 100644 index 0000000..5a00b3e --- /dev/null +++ b/addon/doxywizard/version.cpp @@ -0,0 +1 @@ +char versionString[]="0.1"; diff --git a/addon/doxywizard/version.h b/addon/doxywizard/version.h new file mode 100644 index 0000000..d7d5f13 --- /dev/null +++ b/addon/doxywizard/version.h @@ -0,0 +1,6 @@ +#ifndef VERSION_H +#define VERSION_H + +extern char versionString[]; + +#endif |