summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/config.xml17
-rw-r--r--src/configoptions.cpp24
-rw-r--r--src/diagram.cpp16
-rw-r--r--src/docparser.cpp2
-rw-r--r--src/doctokenizer.l25
-rw-r--r--src/dot.cpp1220
-rw-r--r--src/dot.h100
-rw-r--r--src/doxygen.cpp78
-rw-r--r--src/doxygen.css28
-rw-r--r--src/doxygen.pro.in6
-rw-r--r--src/doxygen_css.h28
-rw-r--r--src/formula.cpp8
-rw-r--r--src/ftvhelp.cpp10
-rw-r--r--src/htags.cpp2
-rw-r--r--src/htmldocvisitor.cpp25
-rw-r--r--src/htmlgen.cpp69
-rw-r--r--src/htmlhelp.cpp1
-rw-r--r--src/index.cpp53
-rw-r--r--src/language.cpp6
-rw-r--r--src/latexgen.cpp16
-rw-r--r--src/latexgen.h2
-rw-r--r--src/memberdef.cpp27
-rw-r--r--src/message.cpp10
-rw-r--r--src/message.h1
-rw-r--r--src/msc.cpp16
-rw-r--r--src/outputgen.cpp3
-rw-r--r--src/outputgen.h1
-rw-r--r--src/portable.cpp24
-rw-r--r--src/portable.h3
-rw-r--r--src/rtfgen.cpp22
-rw-r--r--src/translator_br.h67
-rw-r--r--src/translator_cz.h61
-rw-r--r--src/translator_es.h62
-rw-r--r--src/translator_gr.h900
-rw-r--r--src/translator_hr.h61
-rw-r--r--src/util.cpp32
-rw-r--r--src/util.h3
37 files changed, 1996 insertions, 1033 deletions
diff --git a/src/config.xml b/src/config.xml
index b360841..f78a620 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -833,12 +833,12 @@ reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
will append .docset to the name.
' defval='org.doxygen.Project' depends='GENERATE_DOCSET'/>
<option type='string' id='DOCSET_PUBLISHER_ID' format='string' docs='
-When GENERATE_DOCSET tag specifies a string that should uniquely identify
+When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
the documentation publisher. This should be a reverse domain-name style
string, e.g. com.mycompany.MyDocSet.documentation.
' defval='org.doxygen.Publisher' depends='GENERATE_DOCSET'/>
<option type='string' id='DOCSET_PUBLISHER_NAME' format='string' docs='
-The GENERATE_DOCSET tag identifies the documentation publisher.
+The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
' defval='Publisher' depends='GENERATE_DOCSET'/>
<option type='bool' id='GENERATE_HTMLHELP' docs='
If the GENERATE_HTMLHELP tag is set to YES, additional index files
@@ -964,6 +964,10 @@ If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
used to set the initial width (in pixels) of the frame in which the tree
is shown.
' minval='0' maxval='1500' defval='250' depends='GENERATE_HTML'/>
+ <option type='bool' id='EXT_LINKS_IN_WINDOW' defval='0' docs='
+When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+links to external symbols imported via tag files in a separate window.
+' depends='GENERATE_HTML'/>
<option type='int' id='FORMULA_FONTSIZE' docs='
Use this tag to change the font size of Latex formulas included
as images in the HTML documentation. The default is 10. Note that
@@ -1311,6 +1315,13 @@ available from the path. This tool is part of Graphviz, a graph visualization
toolkit from AT&amp;T and Lucent Bell Labs. The other options in this section
have no effect if this option is set to NO (the default)
' defval='0'/>
+ <option type='int' id='DOT_NUM_THREADS' docs='
+The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+allowed to run in parallel. When set to 0 (the default) doxygen will
+base this on the number of processors available in the system. You can set it
+explicitly to a value larger than 0 to get control over the balance
+between CPU load and processing speed.
+' defval='0' minval='0' maxval='32'/>
<option type='string' id='DOT_FONTNAME' format='string' docs='
By default doxygen will write a font called FreeSans.ttf to the output
directory and reference it in all dot files that doxygen generates. This
@@ -1320,7 +1331,7 @@ using DOT_FONTNAME. You need need to make sure dot is able to find the font,
which can be done by putting it in a standard location or by setting the
DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
containing the font.
-' defval='FreeSans' depends='HAVE_DOT'/>
+' defval='FreeSans.ttf' depends='HAVE_DOT'/>
<option type='int' id='DOT_FONTSIZE' docs='
The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
The default size is 10pt.
diff --git a/src/configoptions.cpp b/src/configoptions.cpp
index d6f161f..08be034 100644
--- a/src/configoptions.cpp
+++ b/src/configoptions.cpp
@@ -1207,7 +1207,7 @@ void addConfigOptions(Config *cfg)
//----
cs = cfg->addString(
"DOCSET_PUBLISHER_ID",
- "When GENERATE_DOCSET tag specifies a string that should uniquely identify\n"
+ "When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify\n"
"the documentation publisher. This should be a reverse domain-name style\n"
"string, e.g. com.mycompany.MyDocSet.documentation."
);
@@ -1216,7 +1216,7 @@ void addConfigOptions(Config *cfg)
//----
cs = cfg->addString(
"DOCSET_PUBLISHER_NAME",
- "The GENERATE_DOCSET tag identifies the documentation publisher."
+ "The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher."
);
cs->setDefaultValue("Publisher");
cs->addDependency("GENERATE_DOCSET");
@@ -1429,6 +1429,14 @@ void addConfigOptions(Config *cfg)
);
ci->addDependency("GENERATE_HTML");
//----
+ cb = cfg->addBool(
+ "EXT_LINKS_IN_WINDOW",
+ "When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n"
+ "links to external symbols imported via tag files in a separate window.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
ci = cfg->addInt(
"FORMULA_FONTSIZE",
"Use this tag to change the font size of Latex formulas included\n"
@@ -1991,6 +1999,16 @@ void addConfigOptions(Config *cfg)
FALSE
);
//----
+ ci = cfg->addInt(
+ "DOT_NUM_THREADS",
+ "The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n"
+ "allowed to run in parallel. When set to 0 (the default) doxygen will\n"
+ "base this on the number of processors available in the system. You can set it\n"
+ "explicitly to a value larger than 0 to get control over the balance\n"
+ "between CPU load and processing speed.",
+ 0,32,0
+ );
+ //----
cs = cfg->addString(
"DOT_FONTNAME",
"By default doxygen will write a font called FreeSans.ttf to the output\n"
@@ -2002,7 +2020,7 @@ void addConfigOptions(Config *cfg)
"DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory\n"
"containing the font."
);
- cs->setDefaultValue("FreeSans");
+ cs->setDefaultValue("FreeSans.ttf");
cs->addDependency("HAVE_DOT");
//----
ci = cfg->addInt(
diff --git a/src/diagram.cpp b/src/diagram.cpp
index 96d057a..ce81a6c 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -161,19 +161,10 @@ static void writeMapArea(FTextStream &t,ClassDef *cd,QCString relPath,
t << "<area ";
if (!ref.isEmpty())
{
- t << "target=\"_blank\" doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
}
t << "href=\"";
- if (!ref.isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- }
- else
- {
- t << relPath;
- }
+ t << externalRef(relPath,ref,TRUE);
t << cd->getOutputFileBase() << Doxygen::htmlFileExtension << "\" ";
t << "alt=\"" << convertToXML(cd->displayName());
t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
@@ -1253,11 +1244,14 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
epsBaseName.data(),epsBaseName.data());
//printf("Converting eps using `%s'\n",epstopdfCmd.data());
+ portable_sysTimerStart();
if (portable_system("epstopdf",epstopdfArgs)!=0)
{
err("Error: Problems running epstopdf. Check your TeX installation!\n");
+ portable_sysTimerStop();
return;
}
+ portable_sysTimerStop();
}
}
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 6ac8ae4..8a8d0ad 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -287,10 +287,12 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
epstopdfArgs.sprintf("\"%s/%s.eps\" --outfile=\"%s/%s.pdf\"",
outputDir.data(), baseName.data(),
outputDir.data(), baseName.data());
+ portable_sysTimerStart();
if (portable_system("epstopdf",epstopdfArgs)!=0)
{
err("Error: Problems running epstopdf. Check your TeX installation!\n");
}
+ portable_sysTimerStop();
return baseName;
}
}
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index d220395..e00d38b 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -16,6 +16,7 @@
*
*/
+
%{
#include <qfile.h>
@@ -181,7 +182,7 @@ static void handleHtmlTag()
// Parse the name portion
int i = startNamePos;
- for (i=startNamePos; i < yyleng; i++)
+ for (i=startNamePos; i < (int)yyleng; i++)
{
// Check for valid HTML/XML name chars (including namespaces)
char c = tagText.at(i);
@@ -192,11 +193,11 @@ static void handleHtmlTag()
// Parse the attributes. Each attribute is a name, value pair
// The result is stored in g_token->attribs.
int startName,endName,startAttrib,endAttrib;
- while (i<yyleng)
+ while (i<(int)yyleng)
{
char c=tagText.at(i);
// skip spaces
- while (i<yyleng && isspace(c)) { c=tagText.at(++i); }
+ while (i<(int)yyleng && isspace(c)) { c=tagText.at(++i); }
// check for end of the tag
if (c == '>') break;
// Check for XML style "empty" tag.
@@ -207,43 +208,43 @@ static void handleHtmlTag()
}
startName=i;
// search for end of name
- while (i<yyleng && !isspace(c) && c!='=') { c=tagText.at(++i); }
+ while (i<(int)yyleng && !isspace(c) && c!='=') { c=tagText.at(++i); }
endName=i;
HtmlAttrib opt;
opt.name = tagText.mid(startName,endName-startName).lower();
// skip spaces
- while (i<yyleng && isspace(c)) { c=tagText.at(++i); }
+ while (i<(int)yyleng && isspace(c)) { c=tagText.at(++i); }
if (tagText.at(i)=='=') // option has value
{
c=tagText.at(++i);
// skip spaces
- while (i<yyleng && isspace(c)) { c=tagText.at(++i); }
+ while (i<(int)yyleng && isspace(c)) { c=tagText.at(++i); }
if (tagText.at(i)=='\'') // option '...'
{
c=tagText.at(++i);
startAttrib=i;
// search for matching quote
- while (i<yyleng && c!='\'') { c=tagText.at(++i); }
+ while (i<(int)yyleng && c!='\'') { c=tagText.at(++i); }
endAttrib=i;
- if (i<yyleng) c=tagText.at(++i);
+ if (i<(int)yyleng) c=tagText.at(++i);
}
else if (tagText.at(i)=='"') // option "..."
{
c=tagText.at(++i);
startAttrib=i;
// search for matching quote
- while (i<yyleng && c!='"') { c=tagText.at(++i); }
+ while (i<(int)yyleng && c!='"') { c=tagText.at(++i); }
endAttrib=i;
- if (i<yyleng) c=tagText.at(++i);
+ if (i<(int)yyleng) c=tagText.at(++i);
}
else // value without any quotes
{
startAttrib=i;
// search for separator or end symbol
- while (i<yyleng && !isspace(c) && c!='>') { c=tagText.at(++i); }
+ while (i<(int)yyleng && !isspace(c) && c!='>') { c=tagText.at(++i); }
endAttrib=i;
- if (i<yyleng) c=tagText.at(++i);
+ if (i<(int)yyleng) c=tagText.at(++i);
}
opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
}
diff --git a/src/dot.cpp b/src/dot.cpp
index 5d9b975..565aa68 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -40,6 +40,11 @@
#include <qfile.h>
#include "ftextstream.h"
#include <md5.h>
+#include <qqueue.h>
+
+#include <qthread.h>
+#include <qmutex.h>
+#include <qwaitcondition.h>
#define MAP_CMD "cmapx"
@@ -81,7 +86,7 @@ static const char *edgeStyleMap[] =
static QCString getDotFontName()
{
static QCString dotFontName = Config_getString("DOT_FONTNAME");
- if (dotFontName.isEmpty()) dotFontName="FreeSans";
+ if (dotFontName.isEmpty()) dotFontName="FreeSans.ttf";
return dotFontName;
}
@@ -151,7 +156,6 @@ static bool convertMapFile(FTextStream &t,const char *mapName,
{
QCString link = buf.mid(indexS+6,indexE-indexS-6);
QCString result;
- QCString *dest;
if (urlOnly) // for user defined dot graphs
{
if (link.left(5)=="\\ref ") // \ref url
@@ -159,15 +163,7 @@ static bool convertMapFile(FTextStream &t,const char *mapName,
result="href=\"";
// fake ref node to resolve the url
DocRef *df = new DocRef( (DocNode*) 0, link.mid(5), context );
- if (!df->ref().isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[df->ref()]))
- result += *dest + "/";
- }
- else if (!relPath.isEmpty())
- {
- result += relPath;
- }
+ result+=externalRef(relPath,df->ref(),TRUE);
if (!df->file().isEmpty())
result += df->file().data() + Doxygen::htmlFileExtension;
if (!df->anchor().isEmpty())
@@ -189,19 +185,10 @@ static bool convertMapFile(FTextStream &t,const char *mapName,
QCString url = link.mid(marker+1);
if (!ref.isEmpty())
{
- result = "target=\"_blank\" doxygen=\"" + ref + ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/";
- result += "\" ";
+ result = externalLinkTarget() + externalRef(relPath,ref,FALSE);
}
result+= "href=\"";
- if (!ref.isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/";
- }
- else if (!relPath.isEmpty())
- {
- result += relPath;
- }
+ result+=externalRef(relPath,ref,TRUE);
result+= url + "\"";
}
else // should not happen, but handle properly anyway
@@ -298,30 +285,97 @@ static void unsetDotFontPath()
g_dotFontPath="";
}
-static bool readBoundingBoxEPS(const char *fileName,int *width,int *height)
+static bool readBoundingBox(const char *fileName,int *width,int *height,bool isEps)
{
- QCString bb("%%PageBoundingBox:");
+ QCString bb = isEps ? QCString("%%PageBoundingBox:") : QCString(" /MediaBox [ ");
QFile f(fileName);
- if (!f.open(IO_ReadOnly)) return FALSE;
+ if (!f.open(IO_ReadOnly|IO_Raw))
+ {
+ //printf("readBoundingBox: could not open %s\n",fileName);
+ return FALSE;
+ }
const int maxLineLen=1024;
char buf[maxLineLen];
while (!f.atEnd())
{
int numBytes = f.readLine(buf,maxLineLen-1); // read line
- buf[numBytes]='\0';
- if (strncmp(buf,bb.data(),bb.length()-1)==0) // found PageBoundingBox string
+ if (numBytes>0)
{
- int x,y;
- if (sscanf(buf+bb.length(),"%d %d %d %d",&x,&y,width,height)!=4)
+ buf[numBytes]='\0';
+ if (strncmp(buf,bb.data(),bb.length()-1)==0) // found PageBoundingBox string
{
- return FALSE;
+ int x,y;
+ if (sscanf(buf+bb.length(),"%d %d %d %d",&x,&y,width,height)!=4)
+ {
+ //printf("readBoundingBox sscanf fail\n");
+ return FALSE;
+ }
+ return TRUE;
}
- return TRUE;
+ }
+ else // read error!
+ {
+ //printf("Read error %d!\n",numBytes);
+ return FALSE;
}
}
+ //printf("readBoundingBox: bounding box not found\n");
return FALSE;
}
+static bool writeVecGfxFigure(FTextStream &out,const QCString &baseName,
+ const QCString &figureName)
+{
+ int width=420,height=600;
+ static bool usePdfLatex = Config_getBool("USE_PDFLATEX");
+ if (usePdfLatex)
+ {
+ if (!readBoundingBox(figureName+".pdf",&width,&height,FALSE))
+ {
+ //printf("writeVecGfxFigure()=0\n");
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!readBoundingBox(figureName+".eps",&width,&height,TRUE))
+ {
+ //printf("writeVecGfxFigure()=0\n");
+ return FALSE;
+ }
+ }
+ //printf("Got PDF/EPS size %d,%d\n",width,height);
+ int maxWidth = 400; /* approx. page width in points, excl. margins */
+ int maxHeight = 600; /* approx. page height in points, excl. margins */
+ out << "\\nopagebreak\n"
+ "\\begin{figure}[H]\n"
+ "\\begin{center}\n"
+ "\\leavevmode\n";
+ if (width>maxWidth || height>maxHeight) // figure too big for page
+ {
+ // c*width/maxWidth > c*height/maxHeight, where c=maxWidth*maxHeight>0
+ if (width*maxHeight>height*maxWidth)
+ {
+ out << "\\includegraphics[width=" << maxWidth << "pt]";
+ }
+ else
+ {
+ out << "\\includegraphics[height=" << maxHeight << "pt]";
+ }
+ }
+ else
+ {
+ out << "\\includegraphics[width=" << width << "pt]";
+ }
+
+ out << "{" << baseName << "}\n"
+ "\\end{center}\n"
+ "\\end{figure}\n";
+
+ //printf("writeVecGfxFigure()=1\n");
+ return TRUE;
+}
+
// since dot silently reproduces the input file when it does not
// support the PNG format, we need to check the result.
static void checkDotResult(const QCString &imgName)
@@ -355,6 +409,27 @@ static void checkDotResult(const QCString &imgName)
}
}
+static bool insertMapFile(FTextStream &out,const QCString &mapFile,
+ const QCString &relPath,const QCString &mapLabel)
+{
+ QFileInfo fi(mapFile);
+ if (fi.exists() && fi.size()>0) // reuse existing map file
+ {
+ QGString tmpstr;
+ FTextStream tmpout(&tmpstr);
+ convertMapFile(tmpout,mapFile,relPath);
+ if (!tmpstr.isEmpty())
+ {
+ out << "<map name=\"" << mapLabel << "\" id=\"" << mapLabel << "\">" << endl;
+ out << tmpstr;
+ out << "</map>" << endl;
+ }
+ return TRUE;
+ }
+ return FALSE; // no map file yet, need to generate it
+}
+
+
/*! Checks if a file "baseName".md5 exists. If so the contents
* are compared with \a md5. If equal FALSE is returned. If the .md5
* file does not exist or its contents are not equal to \a md5,
@@ -386,6 +461,24 @@ static bool checkAndUpdateMd5Signature(const QCString &baseName,const QCString &
return TRUE;
}
+static bool checkDeliverables(const QCString &file1,
+ const QCString &file2=QCString())
+{
+ bool file1Ok = TRUE;
+ bool file2Ok = TRUE;
+ if (!file1.isEmpty())
+ {
+ QFileInfo fi(file1);
+ file1Ok = (fi.exists() && fi.size()>0);
+ }
+ if (!file2.isEmpty())
+ {
+ QFileInfo fi(file2);
+ file2Ok = (fi.exists() && fi.size()>0);
+ }
+ return file1Ok && file2Ok;
+}
+
//--------------------------------------------------------------------
class DotNodeList : public QList<DotNode>
@@ -401,8 +494,13 @@ class DotNodeList : public QList<DotNode>
//--------------------------------------------------------------------
-DotRunner::DotRunner(const char *file) : m_file(file)
+DotRunner::DotRunner(const QCString &file,const QCString &path,
+ bool checkResult,const QCString &imageName)
+ : m_file(file), m_path(path),
+ m_checkResult(checkResult), m_imageName(imageName)
{
+ static bool dotCleanUp = Config_getBool("DOT_CLEANUP");
+ m_cleanUp = dotCleanUp;
m_jobs.setAutoDelete(TRUE);
}
@@ -421,11 +519,12 @@ void DotRunner::addPostProcessing(const char *cmd,const char *args)
bool DotRunner::run()
{
int exitCode=0;
- static QCString dotExe = Config_getString("DOT_PATH")+"dot";
+ static QCString dotExe = Config_getString("DOT_PATH")+"dot";
+ static bool multiTargets = Config_getBool("DOT_MULTI_TARGETS");
QCString dotArgs;
QListIterator<QCString> li(m_jobs);
QCString *s;
- if (Config_getBool("DOT_MULTI_TARGETS"))
+ if (multiTargets)
{
dotArgs="\""+m_file+"\"";
for (li.toFirst();(s=li.current());++li)
@@ -454,6 +553,12 @@ bool DotRunner::run()
err("Error: Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
return FALSE;
}
+ if (m_checkResult) checkDotResult(m_imageName);
+ if (m_cleanUp)
+ {
+ //printf("removing dot file %s\n",m_file.data());
+ QDir(m_path).remove(m_file);
+ }
return TRUE;
error:
err("Problems running dot: exit code=%d, command='%s', arguments='%s'\n",
@@ -463,6 +568,311 @@ error:
//--------------------------------------------------------------------
+DotMapConverter::DotMapConverter(const char *patchFile)
+ : m_patchFile(patchFile)
+{
+ m_maps.setAutoDelete(TRUE);
+}
+
+int DotMapConverter::addMap(const QCString &mapFile,const QCString &relPath,
+ bool urlOnly,const QCString &context,const QCString &label)
+{
+ int id = m_maps.count();
+ Map *map = new Map;
+ map->mapFile = mapFile;
+ map->relPath = relPath;
+ map->urlOnly = urlOnly;
+ map->context = context;
+ map->label = label;
+ m_maps.append(map);
+ return id;
+}
+
+int DotMapConverter::addFigure(const QCString &baseName,
+ const QCString &figureName,bool heightCheck)
+{
+ int id = m_maps.count();
+ Map *map = new Map;
+ map->mapFile = figureName;
+ map->urlOnly = heightCheck;
+ map->label = baseName;
+ m_maps.append(map);
+ return id;
+}
+
+bool DotMapConverter::run()
+{
+ //printf("DotMapConverter::run(): %s\n",m_patchFile.data());
+ QCString tmpName = m_patchFile+".tmp";
+ if (!QDir::current().rename(m_patchFile,tmpName))
+ {
+ err("Failed to rename file %s to %s!\n",m_patchFile.data(),tmpName.data());
+ return FALSE;
+ }
+ QFile fi(tmpName);
+ QFile fo(m_patchFile);
+ if (!fi.open(IO_ReadOnly))
+ {
+ err("Error opening file %s for patching!\n",tmpName.data());
+ QDir::current().rename(tmpName,m_patchFile);
+ return FALSE;
+ }
+ if (!fo.open(IO_WriteOnly))
+ {
+ err("Error opening file %s for patching!\n",m_patchFile.data());
+ QDir::current().rename(tmpName,m_patchFile);
+ return FALSE;
+ }
+ FTextStream t(&fo);
+ const int maxLineLen=100*1024;
+ while (!fi.atEnd()) // foreach line
+ {
+ QCString line(maxLineLen);
+ int numBytes = fi.readLine(line.data(),maxLineLen);
+ int i;
+ ASSERT(numBytes<maxLineLen);
+ if ((i=line.find("<!-- MAP"))!=-1)
+ {
+ int mapId=-1;
+ int n = sscanf(line,"<!-- MAP %d",&mapId);
+ if (n==1 && mapId>=0 && mapId<(int)m_maps.count())
+ {
+ Map *map = m_maps.at(mapId);
+ //printf("patching MAP %d in file %s with contents of %s\n",
+ // mapId,m_patchFile.data(),map->mapFile.data());
+ t << "<map name=\"" << map->label << "\" id=\"" << map->label << "\">" << endl;
+ convertMapFile(t,map->mapFile,map->relPath,map->urlOnly,map->context);
+ t << "</map>" << endl;
+ }
+ else // error invalid map id!
+ {
+ err("Found invalid MAP id in file %s!\n",mapId,m_patchFile.data());
+ t << line;
+ }
+ }
+ else if ((i=line.find("% FIG"))!=-1)
+ {
+ int mapId=-1;
+ int n = sscanf(line.data()+i+2,"FIG %d",&mapId);
+ //printf("line='%s' n=%d\n",line.data()+i,n);
+ if (n==1 && mapId>=0 && mapId<(int)m_maps.count())
+ {
+ Map *map = m_maps.at(mapId);
+ //printf("patching FIG %d in file %s with contents of %s\n",
+ // mapId,m_patchFile.data(),map->mapFile.data());
+ writeVecGfxFigure(t,map->label,map->mapFile);
+ }
+ else // error invalid map id!
+ {
+ err("Found invalid bounding FIG id in file %s!\n",mapId,m_patchFile.data());
+ t << line;
+ }
+ }
+ else
+ {
+ t << line;
+ }
+ }
+ fi.close();
+ QDir::current().remove(tmpName);
+ return TRUE;
+}
+
+//--------------------------------------------------------------------
+
+void DotRunnerQueue::enqueue(DotRunner *runner)
+{
+ QMutexLocker locker(&m_mutex);
+ m_queue.enqueue(runner);
+ m_bufferNotEmpty.wakeAll();
+}
+
+DotRunner *DotRunnerQueue::dequeue()
+{
+ QMutexLocker locker(&m_mutex);
+ while (m_queue.isEmpty())
+ {
+ // wait until something is added to the queue
+ m_bufferNotEmpty.wait(&m_mutex);
+ }
+ DotRunner *result = m_queue.dequeue();
+ return result;
+}
+
+uint DotRunnerQueue::count() const
+{
+ QMutexLocker locker(&m_mutex);
+ return m_queue.count();
+}
+
+//--------------------------------------------------------------------
+
+DotWorkerThread::DotWorkerThread(int id,DotRunnerQueue *queue)
+ : m_id(id), m_queue(queue)
+{
+}
+
+void DotWorkerThread::run()
+{
+ DotRunner *runner;
+ while ((runner=m_queue->dequeue()))
+ {
+ runner->run();
+ }
+}
+
+//--------------------------------------------------------------------
+
+DotManager *DotManager::m_theInstance = 0;
+
+DotManager *DotManager::instance()
+{
+ if (!m_theInstance)
+ {
+ m_theInstance = new DotManager;
+ }
+ return m_theInstance;
+}
+
+DotManager::DotManager() : m_dotMaps(1007)
+{
+ m_dotRuns.setAutoDelete(TRUE);
+ m_dotMaps.setAutoDelete(TRUE);
+ m_queue = new DotRunnerQueue;
+ int i;
+ int numThreads = QMIN(32,Config_getInt("DOT_NUM_THREADS"));
+ if (numThreads==0) numThreads = QMAX(1,QThread::idealThreadCount()+1);
+ for (i=0;i<numThreads;i++)
+ {
+ DotWorkerThread *thread = new DotWorkerThread(i,m_queue);
+ thread->start();
+ if (thread->isRunning())
+ {
+ m_workers.append(thread);
+ }
+ else // no more threads available!
+ {
+ delete thread;
+ }
+ }
+ ASSERT(m_workers.count()>0);
+}
+
+DotManager::~DotManager()
+{
+ delete m_queue;
+}
+
+void DotManager::addRun(DotRunner *run)
+{
+ m_dotRuns.append(run);
+}
+
+int DotManager::addMap(const QCString &file,const QCString &mapFile,
+ const QCString &relPath,bool urlOnly,const QCString &context,
+ const QCString &label)
+{
+ DotMapConverter *map = m_dotMaps.find(file);
+ if (map==0)
+ {
+ map = new DotMapConverter(file);
+ m_dotMaps.append(file,map);
+ }
+ return map->addMap(mapFile,relPath,urlOnly,context,label);
+}
+
+int DotManager::addFigure(const QCString &file,const QCString &baseName,
+ const QCString &figureName,bool heightCheck)
+{
+ DotMapConverter *map = m_dotMaps.find(file);
+ if (map==0)
+ {
+ map = new DotMapConverter(file);
+ m_dotMaps.append(file,map);
+ }
+ return map->addFigure(baseName,figureName,heightCheck);
+}
+
+bool DotManager::run()
+{
+ msg("Generating dot graphs using %d parallel threads...\n",m_workers.count());
+ uint numDotRuns = m_dotRuns.count();
+ uint numDotMaps = m_dotMaps.count();
+ int i=1;
+ QListIterator<DotRunner> li(m_dotRuns);
+
+ bool setPath=FALSE;
+ if (Config_getBool("GENERATE_HTML"))
+ {
+ setDotFontPath(Config_getString("HTML_OUTPUT"));
+ setPath=TRUE;
+ }
+ else if (Config_getBool("GENERATE_LATEX"))
+ {
+ setDotFontPath(Config_getString("LATEX_OUTPUT"));
+ setPath=TRUE;
+ }
+ else if (Config_getBool("GENERATE_RTF"))
+ {
+ setDotFontPath(Config_getString("RTF_OUTPUT"));
+ setPath=TRUE;
+ }
+ portable_sysTimerStart();
+ // fill work queue with dot operations
+ DotRunner *dr;
+ for (li.toFirst();(dr=li.current());++li)
+ {
+ m_queue->enqueue(dr);
+ }
+ int prev=1;
+ // wait for the queue to become empty
+ while ((i=m_queue->count())>0)
+ {
+ i = numDotRuns - i;
+ while (i>=prev)
+ {
+ msg("Running dot for graph %d/%d\n",prev,numDotRuns);
+ prev++;
+ }
+ portable_sleep(100);
+ }
+ while ((int)numDotRuns>=prev)
+ {
+ msg("Running dot for graph %d/%d\n",prev,numDotRuns);
+ prev++;
+ }
+ // signal the workers we are done
+ for (i=0;i<(int)m_workers.count();i++)
+ {
+ m_queue->enqueue(0); // add terminator for each worker
+ }
+ // wait for the workers to finish
+ for (i=0;i<(int)m_workers.count();i++)
+ {
+ m_workers.at(i)->wait();
+ }
+ portable_sysTimerStop();
+ if (setPath)
+ {
+ unsetDotFontPath();
+ }
+
+ // patch the output file and insert the maps and figures
+ i=1;
+ SDict<DotMapConverter>::Iterator di(m_dotMaps);
+ DotMapConverter *map;
+ for (di.toFirst();(map=di.current());++di)
+ {
+ msg("Inserting map/figure %d/%d\n",i,numDotMaps);
+ if (!map->run()) return FALSE;
+ i++;
+ }
+ return TRUE;
+}
+
+
+//--------------------------------------------------------------------
+
/*! helper function that deletes all nodes in a connected graph, given
* one of the graph's nodes
@@ -1101,7 +1511,8 @@ const DotNode *DotNode::findDocNode() const
int DotGfxHierarchyTable::m_curNodeNumber;
-void DotGfxHierarchyTable::writeGraph(FTextStream &out,const char *path) const
+void DotGfxHierarchyTable::writeGraph(FTextStream &out,
+ const char *path,const char *fileName) const
{
//printf("DotGfxHierarchyTable::writeGraph(%s)\n",name);
//printf("m_rootNodes=%p count=%d\n",m_rootNodes,m_rootNodes->count());
@@ -1113,11 +1524,6 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,const char *path) const
{
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
- setDotFontPath(d.absPath());
- //QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- //QDir::setCurrent(d.absPath());
- //QDir thisDir;
// put each connected subgraph of the hierarchy in a row of the HTML output
out << "<table border=\"0\" cellspacing=\"10\" cellpadding=\"0\">" << endl;
@@ -1142,7 +1548,6 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,const char *path) const
// compute md5 checksum of the graph were are about to generate
QGString theGraph;
FTextStream md5stream(&theGraph);
- //md5stream.setEncoding(md5stream.UnicodeUTF8);
writeGraphHeader(md5stream);
md5stream << " rankdir=LR;" << endl;
for (dnli2.toFirst();(node=dnli2.current());++dnli2)
@@ -1165,44 +1570,42 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,const char *path) const
QCString sigStr(33);
MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
MD5SigToString(md5_sig,sigStr.data(),33);
+ bool regenerate=FALSE;
if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
- !QFileInfo(absMapName).exists())
+ !checkDeliverables(absMapName))
{
+ regenerate=TRUE;
// image was new or has changed
QCString dotName=absBaseName+".dot";
QFile f(dotName);
if (!f.open(IO_WriteOnly)) return;
FTextStream t(&f);
- //t.setEncoding(t.UnicodeUTF8);
t << theGraph;
f.close();
resetReNumbering();
- DotRunner dotRun(dotName);
- dotRun.addJob(imgExt,absImgName);
- dotRun.addJob(MAP_CMD,absMapName);
- if (!dotRun.run())
- {
- out << "</table>" << endl;
- unsetDotFontPath();
- return;
- }
- checkDotResult(absImgName);
- if (Config_getBool("DOT_CLEANUP")) d.remove(dotName);
+ DotRunner *dotRun = new DotRunner(dotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+
}
Doxygen::indexList.addImageFile(imgName);
// write image and map in a table row
QCString mapLabel = escapeCharsInString(n->m_label,FALSE);
out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#"
- << mapLabel << "_map\"/>" << endl;
- out << "<map name=\"" << mapLabel << "_map\" id=\"" << mapLabel << "\">" << endl;
- convertMapFile(out,absMapName,"");
- out << "</map></td></tr>" << endl;
- //thisDir.remove(mapName);
+ << mapLabel << "\"/>" << endl;
+
+ if (regenerate || !insertMapFile(out,absMapName,QCString(),mapLabel))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,QCString(),
+ FALSE,QCString(),mapLabel);
+ out << "<!-- MAP " << mapId << " -->" << endl;
+ }
+
+ out << "</td></tr>" << endl;
}
out << "</table>" << endl;
-
- unsetDotFontPath();
}
void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
@@ -1779,7 +2182,6 @@ QCString computeMd5Signature(DotNode *root,
//printf("computeMd5Signature\n");
QGString buf;
FTextStream md5stream(&buf);
- //md5stream.setEncoding(md5stream.UnicodeUTF8);
writeGraphHeader(md5stream);
if (lrRank)
{
@@ -1855,7 +2257,6 @@ static bool updateDotGraph(DotNode *root,
if (f.open(IO_WriteOnly))
{
FTextStream t(&f);
- //t.setEncoding(t.UnicodeUTF8);
t << theGraph;
}
return TRUE;
@@ -1887,6 +2288,7 @@ QCString DotClassGraph::diskName() const
QCString DotClassGraph::writeGraph(FTextStream &out,
GraphOutputFormat format,
const char *path,
+ const char *fileName,
const char *relPath,
bool /*isTBRank*/,
bool generateImageMap) const
@@ -1897,7 +2299,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
{
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
- setDotFontPath(d.absPath());
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
QCString baseName;
QCString mapName;
@@ -1917,10 +2319,16 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
break;
}
baseName = convertNameToFile(diskName());
- QCString absBaseName = QCString(d.absPath().data())+"/"+baseName;
QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString absBaseName = QCString(d.absPath())+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+ bool regenerate = FALSE;
if (updateDotGraph(m_startNode,
m_graphType,
absBaseName,
@@ -1928,44 +2336,37 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
m_lrRank,
m_graphType==DotNode::Inheritance,
TRUE
- )
- )
+ ) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
{
+ regenerate=TRUE;
if (format==BITMAP) // run dot to create a bitmap image
{
QCString dotArgs(maxCmdLine);
- QCString absImgName = absBaseName+"."+imgExt;
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob(imgExt,absImgName);
- if (generateImageMap) dotRun.addJob(MAP_CMD,absBaseName+".map");
- if (!dotRun.run())
- {
- unsetDotFontPath();
- return baseName;
- }
- checkDotResult(absImgName);
+ DotRunner *dotRun = new DotRunner(absDotName,
+ d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+
}
else if (format==EPS) // run dot to create a .eps image
{
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob("ps",absBaseName+".eps");
-
- if (Config_getBool("USE_PDFLATEX"))
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
{
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- absBaseName.data(),absBaseName.data());
- dotRun.addPostProcessing("epstopdf",epstopdfArgs);
+ dotRun->addJob("pdf",absPdfName);
}
-
- if (!dotRun.run())
+ else
{
- unsetDotFontPath();
- return baseName;
+ dotRun->addJob("ps",absEpsName);
}
+ DotManager::instance()->addRun(dotRun);
}
- if (Config_getBool("DOT_CLEANUP")) d.remove(baseName+".dot");
}
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
@@ -1989,49 +2390,21 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
break;
}
out << "\"/></div>" << endl;
- QGString tmpstr;
- FTextStream tmpout(&tmpstr);
- convertMapFile(tmpout,absBaseName+".map",relPath);
- if (!tmpstr.isEmpty())
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapLabel))
{
- out << "<map name=\"" << mapLabel << "\" id=\"" << mapLabel << "\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapLabel);
+ out << "<!-- MAP " << mapId << " -->" << endl;
}
}
else if (format==EPS) // produce tex to include the .eps image
{
- int width=420,height=600;
- if (!readBoundingBoxEPS(absBaseName+".eps",&width,&height))
- {
- err("Error: Could not extract bounding box from .eps!\n");
- unsetDotFontPath();
- return baseName;
- }
- //printf("Got EPS size %d,%d\n",width,height);
- int maxWidth = 400; /* approx. page width in points, excl. margins */
- int maxHeight = 400; /* approx. page height in points, excl. margins */
- out << "\\nopagebreak\n"
- "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n";
- if (width>maxWidth)
- {
- out << "\\includegraphics[width=" << maxWidth << "pt]";
- }
- else if (height>maxHeight)
- {
- out << "\\includegraphics[height=" << maxHeight << "pt]";
- }
- else
- {
- out << "\\includegraphics[width=" << width << "pt]";
- }
- out << "{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
+ {
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE /*TRUE*/);
+ out << endl << "% FIG " << figId << endl;
+ }
}
- unsetDotFontPath();
return baseName;
}
@@ -2225,6 +2598,7 @@ QCString DotInclDepGraph::diskName() const
QCString DotInclDepGraph::writeGraph(FTextStream &out,
GraphOutputFormat format,
const char *path,
+ const char *fileName,
const char *relPath,
bool generateImageMap
) const
@@ -2235,7 +2609,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
{
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
- setDotFontPath(d.absPath());
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
QCString baseName=m_diskName;
if (m_inverse) baseName+="_dep";
@@ -2243,11 +2617,16 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
baseName=convertNameToFile(baseName);
QCString mapName=escapeCharsInString(m_startNode->m_label,FALSE);
if (m_inverse) mapName+="dep";
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
QCString absBaseName = QCString(d.absPath())+"/"+baseName;
- QCString absMapName = QCString(d.absPath())+"/"+mapName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+ bool regenerate = FALSE;
if (updateDotGraph(m_startNode,
DotNode::Dependency,
absBaseName,
@@ -2255,42 +2634,36 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
FALSE, // lrRank
FALSE, // renderParents
m_inverse // backArrows
- )
- )
+ ) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
{
+ regenerate=TRUE;
if (format==BITMAP)
{
// run dot to create a bitmap image
QCString dotArgs(maxCmdLine);
- QCString absImgName=absBaseName+"."+imgExt;
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob(imgExt,absImgName);
- if (generateImageMap) dotRun.addJob(MAP_CMD,absBaseName+".map");
- if (!dotRun.run())
- {
- unsetDotFontPath();
- return baseName;
- }
- checkDotResult(absImgName);
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
}
else if (format==EPS)
{
- // run dot to create a .eps image
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob("ps",absBaseName+".eps");
- if (Config_getBool("USE_PDFLATEX"))
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
{
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- absBaseName.data(),absBaseName.data());
- dotRun.addPostProcessing("epstopdf",epstopdfArgs);
+ dotRun->addJob("pdf",absPdfName);
}
- if (!dotRun.run())
+ else
{
- unsetDotFontPath();
- return baseName;
+ dotRun->addJob("ps",absEpsName);
}
- }
+ DotManager::instance()->addRun(dotRun);
+
+ }
}
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
@@ -2298,43 +2671,27 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
{
out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
- << mapName << "_map\" alt=\"\"/>";
+ << mapName << "\" alt=\"\"/>";
out << "</div>" << endl;
- QGString tmpstr;
- FTextStream tmpout(&tmpstr);
- //tmpout.setEncoding(tmpout.UnicodeUTF8);
- convertMapFile(tmpout,absBaseName+".map",relPath);
- if (!tmpstr.isEmpty())
+
+ QCString absMapName = absBaseName+".map";
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapName))
{
- out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapName);
+ out << "<!-- MAP " << mapId << " -->" << endl;
}
+
}
else if (format==EPS)
{
- int width,height;
- if (!readBoundingBoxEPS(absBaseName+".eps",&width,&height))
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
{
- err("Error: Could not extract bounding box from .eps!\n");
- unsetDotFontPath();
- return baseName;
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ out << endl << "% FIG " << figId << endl;
}
- int maxWidth = 420; /* approx. page width in points */
-
- out << "\\nopagebreak\n"
- "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
}
- if (Config_getBool("DOT_CLEANUP")) d.remove(baseName+".dot");
-
- unsetDotFontPath();
return baseName;
}
@@ -2518,7 +2875,8 @@ DotCallGraph::~DotCallGraph()
}
QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
- const char *path,const char *relPath,bool generateImageMap) const
+ const char *path,const char *fileName,
+ const char *relPath,bool generateImageMap) const
{
QDir d(path);
// store the original directory
@@ -2526,14 +2884,20 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
{
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
- setDotFontPath(d.absPath());
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
QCString baseName = m_diskName + (m_inverse ? "_icgraph" : "_cgraph");
- QCString mapName=baseName;
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString mapName = baseName;
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
QCString absBaseName = QCString(d.absPath())+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+ bool regenerate=FALSE;
if (updateDotGraph(m_startNode,
DotNode::CallGraph,
absBaseName,
@@ -2541,41 +2905,37 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
TRUE, // lrRank
FALSE, // renderParents
m_inverse // backArrows
- )
- )
+ ) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
{
+ regenerate=TRUE;
if (format==BITMAP)
{
// run dot to create a bitmap image
QCString dotArgs(maxCmdLine);
- QCString absImgName=absBaseName+"."+imgExt;
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob(imgExt,absImgName);
- if (generateImageMap) dotRun.addJob(MAP_CMD,absBaseName+".map");
- if (!dotRun.run())
- {
- unsetDotFontPath();
- return baseName;
- }
- checkDotResult(absImgName);
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+
}
else if (format==EPS)
{
// run dot to create a .eps image
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob("ps",absBaseName+".eps");
- if (Config_getBool("USE_PDFLATEX"))
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
{
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- absBaseName.data(),absBaseName.data());
- dotRun.addPostProcessing("epstopdf",epstopdfArgs);
+ dotRun->addJob("pdf",absPdfName);
}
- if (!dotRun.run())
+ else
{
- unsetDotFontPath();
- return baseName;
+ dotRun->addJob("ps",absEpsName);
}
+ DotManager::instance()->addRun(dotRun);
+
}
}
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
@@ -2584,44 +2944,27 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
{
out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
- << mapName << "_map\" alt=\"";
+ << mapName << "\" alt=\"";
out << "\"/>";
out << "</div>" << endl;
- QGString tmpstr;
- FTextStream tmpout(&tmpstr);
- //tmpout.setEncoding(tmpout.UnicodeUTF8);
- convertMapFile(tmpout,absBaseName+".map",relPath);
- if (!tmpstr.isEmpty())
+
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapName))
{
- out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapName);
+ out << "<!-- MAP " << mapId << " -->" << endl;
}
+
}
else if (format==EPS)
{
- int width,height;
- if (!readBoundingBoxEPS(absBaseName+".eps",&width,&height))
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
{
- err("Error: Could not extract bounding box from .eps!\n");
- unsetDotFontPath();
- return baseName;
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ out << endl << "% FIG " << figId << endl;
}
- int maxWidth = 420; /* approx. page width in points */
-
- out << "\\nopagebreak\n"
- "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
}
- if (Config_getBool("DOT_CLEANUP")) d.remove(baseName+".dot");
-
- unsetDotFontPath();
return baseName;
}
@@ -2650,6 +2993,7 @@ DotDirDeps::~DotDirDeps()
QCString DotDirDeps::writeGraph(FTextStream &out,
GraphOutputFormat format,
const char *path,
+ const char *fileName,
const char *relPath,
bool generateImageMap) const
{
@@ -2659,58 +3003,66 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
{
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
- setDotFontPath(d.absPath());
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
QCString baseName=m_dir->getOutputFileBase()+"_dep";
QCString mapName=escapeCharsInString(baseName,FALSE);
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
QCString absBaseName = QCString(d.absPath())+"/"+baseName;
-
- // TODO: create check, update md5 checksum
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+
+ // compute md5 checksum of the graph were are about to generate
+ QGString theGraph;
+ FTextStream md5stream(&theGraph);
+ m_dir->writeDepGraph(md5stream);
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ bool regenerate=FALSE;
+ if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
{
- QFile f(absBaseName+".dot");
+ regenerate=TRUE;
+
+ QFile f(absDotName);
if (!f.open(IO_WriteOnly))
{
err("Cannot create file %s.dot for writing!\n",baseName.data());
}
FTextStream t(&f);
- //t.setEncoding(t.UnicodeUTF8);
- m_dir->writeDepGraph(t);
+ t << theGraph.data();
f.close();
if (format==BITMAP)
{
// run dot to create a bitmap image
QCString dotArgs(maxCmdLine);
- QCString absImgName=absBaseName+"."+imgExt;
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob(imgExt,absImgName);
- if (generateImageMap) dotRun.addJob(MAP_CMD,absBaseName+".map");
- if (!dotRun.run())
- {
- unsetDotFontPath();
- return baseName;
- }
- checkDotResult(absImgName);
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
}
else if (format==EPS)
{
- // run dot to create a .eps image
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob("ps",absBaseName+".eps");
- if (Config_getBool("USE_PDFLATEX"))
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
{
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- absBaseName.data(),absBaseName.data());
- dotRun.addPostProcessing("epstopdf",epstopdfArgs);
+ dotRun->addJob("pdf",absPdfName);
}
- if (!dotRun.run())
+ else
{
- unsetDotFontPath();
- return baseName;
+ dotRun->addJob("ps",absEpsName);
}
+ DotManager::instance()->addRun(dotRun);
}
}
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
@@ -2719,50 +3071,27 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
{
out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
- << mapName << "_map\" alt=\"";
+ << mapName << "\" alt=\"";
out << convertToXML(m_dir->displayName());
out << "\"/>";
out << "</div>" << endl;
- QGString tmpstr;
- FTextStream tmpout(&tmpstr);
- //tmpout.setEncoding(tmpout.UnicodeUTF8);
- convertMapFile(tmpout,absBaseName+".map",relPath,TRUE);
- if (!tmpstr.isEmpty())
- {
- out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
- }
- else
+
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapName))
{
- //printf("Map is empty!\n");
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ TRUE,QCString(),mapName);
+ out << "<!-- MAP " << mapId << " -->" << endl;
}
- //thisDir.remove(baseName+".map");
}
else if (format==EPS)
{
- int width,height;
- if (!readBoundingBoxEPS(absBaseName+".eps",&width,&height))
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
{
- err("Error: Could not extract bounding box from .eps!\n");
- unsetDotFontPath();
- return baseName;
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ out << endl << "% FIG " << figId << endl;
}
- int maxWidth = 420; /* approx. page width in points */
-
- out << "\\nopagebreak\n"
- "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
}
- if (Config_getBool("DOT_CLEANUP")) d.remove(baseName+".dot");
-
- unsetDotFontPath();
return baseName;
}
@@ -2775,58 +3104,65 @@ bool DotDirDeps::isTrivial() const
void generateGraphLegend(const char *path)
{
- QFile dotFile((QCString)path+"/graph_legend.dot");
- if (!dotFile.open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",
- convertToQCString(dotFile.name()).data());
- return;
- }
- FTextStream dotText(&dotFile);
- writeGraphHeader(dotText);
- dotText << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",fillcolor=\"grey75\",style=\"filled\" fontcolor=\"black\"];\n";
- dotText << " Node10 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classPublicBase" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node11 -> Node10 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node11 [shape=\"box\",label=\"Truncated\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"red\",URL=\"$classTruncated" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node13 -> Node9 [dir=back,color=\"darkgreen\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node13 [shape=\"box\",label=\"ProtectedBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classProtectedBase" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node14 -> Node9 [dir=back,color=\"firebrick4\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node14 [shape=\"box\",label=\"PrivateBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classPrivateBase" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node15 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node15 [shape=\"box\",label=\"Undocumented\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"grey75\"];\n";
- dotText << " Node16 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node16 [shape=\"box\",label=\"Templ< int >\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node17 -> Node16 [dir=back,color=\"orange\",fontsize=\"" << FONTSIZE << "\",style=\"dashed\",label=\"< int >\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node18 -> Node9 [dir=back,color=\"darkorchid3\",fontsize=\"" << FONTSIZE << "\",style=\"dashed\",label=\"m_usedClass\",fontname=\"" << FONTNAME << "\"];\n";
- dotText << " Node18 [shape=\"box\",label=\"Used\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classUsed" << Doxygen::htmlFileExtension << "\"];\n";
- writeGraphFooter(dotText);
- dotFile.close();
-
QDir d(path);
// store the original directory
if (!d.exists())
{
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
- setDotFontPath(d.absPath());
- // run dot to generate the a bitmap image from the graph
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- QCString imgName = "graph_legend."+imgExt;
- QCString absImgName = QCString(d.absPath())+"/"+ imgName;
-
- DotRunner dotRun(d.absPath()+"/graph_legend.dot");
- dotRun.addJob(imgExt,absImgName);
- if (!dotRun.run())
+ QGString theGraph;
+ FTextStream md5stream(&theGraph);
+ writeGraphHeader(md5stream);
+ md5stream << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",fillcolor=\"grey75\",style=\"filled\" fontcolor=\"black\"];\n";
+ md5stream << " Node10 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classPublicBase" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node11 -> Node10 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node11 [shape=\"box\",label=\"Truncated\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"red\",URL=\"$classTruncated" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node13 -> Node9 [dir=back,color=\"darkgreen\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node13 [shape=\"box\",label=\"ProtectedBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classProtectedBase" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node14 -> Node9 [dir=back,color=\"firebrick4\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node14 [shape=\"box\",label=\"PrivateBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classPrivateBase" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node15 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node15 [shape=\"box\",label=\"Undocumented\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"grey75\"];\n";
+ md5stream << " Node16 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node16 [shape=\"box\",label=\"Templ< int >\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node17 -> Node16 [dir=back,color=\"orange\",fontsize=\"" << FONTSIZE << "\",style=\"dashed\",label=\"< int >\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node18 -> Node9 [dir=back,color=\"darkorchid3\",fontsize=\"" << FONTSIZE << "\",style=\"dashed\",label=\"m_usedClass\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node18 [shape=\"box\",label=\"Used\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classUsed" << Doxygen::htmlFileExtension << "\"];\n";
+ writeGraphFooter(md5stream);
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ QCString absBaseName = (QCString)path+"/graph_legend";
+ QCString absDotName = absBaseName+".dot";
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString imgName = "graph_legend."+imgExt;
+ QCString absImgName = absBaseName+"."+imgExt;
+ if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
+ !checkDeliverables(absImgName))
{
- unsetDotFontPath();
- return;
+ QFile dotFile(absDotName);
+ if (!dotFile.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",
+ convertToQCString(dotFile.name()).data());
+ return;
+ }
+
+ FTextStream dotText(&dotFile);
+ dotText << theGraph;
+ dotFile.close();
+
+ // run dot to generate the a bitmap image from the graph
+
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ DotManager::instance()->addRun(dotRun);
}
- checkDotResult(absImgName);
- Doxygen::indexList.addImageFile(imgName);
- unsetDotFontPath();
+
}
void writeDotGraphFromFile(const char *inFile,const char *outDir,
@@ -2837,37 +3173,37 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
{
err("Error: Output dir %s does not exist!\n",outDir); exit(1);
}
- setDotFontPath("");
QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
QCString imgName = (QCString)outFile+"."+imgExt;
QCString absImgName = QCString(d.absPath())+"/"+imgName;
QCString absOutFile = QCString(d.absPath())+"/"+outFile;
- DotRunner dotRun(inFile);
+ DotRunner dotRun(inFile,d.absPath().data(),FALSE,absImgName);
if (format==BITMAP)
dotRun.addJob(imgExt,absImgName);
else // format==EPS
- dotRun.addJob("ps",absOutFile+".eps");
-
- if ( (format==EPS) && (Config_getBool("USE_PDFLATEX")) )
{
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- absOutFile.data(),absOutFile.data());
- dotRun.addPostProcessing("epstopdf",epstopdfArgs);
+ if (Config_getBool("USE_PDFLATEX"))
+ {
+ dotRun.addJob("pdf",absOutFile+".pdf");
+ }
+ else
+ {
+ dotRun.addJob("ps",absOutFile+".eps");
+ }
}
+ dotRun.preventCleanUp();
if (!dotRun.run())
{
- unsetDotFontPath();
return;
}
if (format==BITMAP) checkDotResult(absImgName);
+
Doxygen::indexList.addImageFile(imgName);
- unsetDotFontPath();
}
@@ -2875,40 +3211,38 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
* dotfiles to generate image maps.
* \param inFile just the basename part of the filename
* \param outDir output directory
+ * \param fileName file name in which the map will be embedded
* \param relPath relative path the to root of the output dir
* \param context the scope in which this graph is found (for resolving links)
* \returns a string which is the HTML image map (without the \<map\>\</map\>)
*/
QCString getDotImageMapFromFile(const QCString& inFile, const QCString& outDir,
- const QCString &relPath,const QCString &context)
+ const QCString &relPath, const QCString &context)
{
- QString outFile = inFile + ".map";
+ QCString outFile = inFile + ".map";
QDir d(outDir);
if (!d.exists())
{
err("Error: Output dir %s does not exist!\n",outDir.data()); exit(1);
}
- setDotFontPath(d.absPath());
- QCString absInFile = QCString(d.absPath())+"/"+inFile.data();
- QCString absOutFile = QCString(d.absPath())+"/"+outFile.data();
+ QCString absInFile = QCString(d.absPath())+"/"+inFile;
+ QCString absOutFile = QCString(d.absPath())+"/"+outFile;
- DotRunner dotRun(absInFile);
+ DotRunner dotRun(absInFile,d.absPath().data(),FALSE);
dotRun.addJob(MAP_CMD,absOutFile);
+ dotRun.preventCleanUp();
if (!dotRun.run())
{
- unsetDotFontPath();
return "";
}
QGString result;
FTextStream tmpout(&result);
- //tmpout.setEncoding(tmpout.UnicodeUTF8);
convertMapFile(tmpout, absOutFile, relPath ,TRUE, context);
d.remove(outFile);
- unsetDotFontPath();
return result.data();
}
// end MDG mods
@@ -3125,7 +3459,7 @@ void DotGroupCollaboration::addCollaborationMember(
QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat format,
- const char *path, const char *relPath,
+ const char *path, const char *fileName, const char *relPath,
bool writeImageMap) const
{
QDir d(path);
@@ -3134,113 +3468,117 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
{
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
- setDotFontPath(d.absPath());
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
- QCString baseName = m_diskName;
- QCString absBaseName = QCString(d.absPath())+"/"+baseName;
+ QGString theGraph;
+ FTextStream md5stream(&theGraph);
+ writeGraphHeader(md5stream);
- QFile dotfile(absBaseName+".dot");
- if (dotfile.open(IO_WriteOnly))
+ // clean write flags
+ QDictIterator<DotNode> dni(*m_usedNodes);
+ DotNode *pn;
+ for (dni.toFirst();(pn=dni.current());++dni)
{
- FTextStream tdot(&dotfile);
- //tdot.setEncoding(tdot.UnicodeUTF8);
- writeGraphHeader(tdot);
-
- // clean write flags
- QDictIterator<DotNode> dni(*m_usedNodes);
- DotNode *pn;
- for (dni.toFirst();(pn=dni.current());++dni)
- pn->clearWriteFlag();
-
- // write other nodes.
- for (dni.toFirst();(pn=dni.current());++dni)
- {
- pn->write(tdot,DotNode::Inheritance,format,TRUE,FALSE,FALSE,FALSE);
- }
-
- // write edges
- QListIterator<Edge> eli(m_edges);
- Edge* edge;
- for (eli.toFirst();(edge=eli.current());++eli)
- {
- edge->write( tdot );
- }
+ pn->clearWriteFlag();
+ }
- writeGraphFooter(tdot);
- dotfile.close();
+ // write other nodes.
+ for (dni.toFirst();(pn=dni.current());++dni)
+ {
+ pn->write(md5stream,DotNode::Inheritance,format,TRUE,FALSE,FALSE,FALSE);
}
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- if (format==BITMAP) // run dot to create a bitmap image
+ // write edges
+ QListIterator<Edge> eli(m_edges);
+ Edge* edge;
+ for (eli.toFirst();(edge=eli.current());++eli)
{
- QCString dotArgs(maxCmdLine);
- QCString imgName = baseName+"."+imgExt;
- QCString mapName=baseName+".map";
+ edge->write( md5stream );
+ }
- QCString absImgName = QCString(d.absPath())+"/"+imgName;
- QCString absMapName = QCString(d.absPath())+"/"+mapName;
+ writeGraphFooter(md5stream);
+ resetReNumbering();
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString baseName = m_diskName;
+ QCString imgName = baseName+"."+imgExt;
+ QCString mapName = baseName+".map";
+ QCString absPath = d.absPath().data();
+ QCString absBaseName = absPath+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absImgName = absBaseName+"."+imgExt;
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ bool regenerate=FALSE;
+ if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP /*&& generateImageMap*/ ? absMapName : QCString())
+ )
+ {
+ regenerate=TRUE;
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob(imgExt,absImgName);
- if (writeImageMap) dotRun.addJob(MAP_CMD,absMapName);
- if (!dotRun.run())
+ QFile dotfile(absDotName);
+ if (dotfile.open(IO_WriteOnly))
{
- unsetDotFontPath();
- return baseName;
+ FTextStream tdot(&dotfile);
+ tdot << theGraph;
+ dotfile.close();
}
- if (writeImageMap)
+ if (format==BITMAP) // run dot to create a bitmap image
{
- QCString mapLabel = escapeCharsInString(baseName,FALSE);
- t << "<center><table><tr><td><img src=\"" << relPath << imgName
- << "\" border=\"0\" alt=\"\" usemap=\"#"
- << mapLabel << "_map\"/>" << endl;
- t << "<map name=\"" << mapLabel << "_map\" id=\"" << mapLabel << "\">" << endl;
- convertMapFile(t,absMapName,relPath);
- t << "</map></td></tr></table></center>" << endl;
+ QCString dotArgs(maxCmdLine);
+
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ dotRun->addJob(imgExt,absImgName);
+ if (writeImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+
}
- }
- else if (format==EPS)
- {
- DotRunner dotRun(absBaseName+".dot");
- dotRun.addJob("ps",absBaseName+".eps");
- if (Config_getBool("USE_PDFLATEX"))
+ else if (format==EPS)
{
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- absBaseName.data(),absBaseName.data());
- dotRun.addPostProcessing("epstopdf",epstopdfArgs);
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
+ {
+ dotRun->addJob("pdf",absPdfName);
+ }
+ else
+ {
+ dotRun->addJob("ps",absEpsName);
+ }
+ DotManager::instance()->addRun(dotRun);
}
- if (!dotRun.run())
+ }
+ if (format==BITMAP && writeImageMap)
+ {
+ QCString mapLabel = escapeCharsInString(baseName,FALSE);
+ t << "<center><table><tr><td><img src=\"" << relPath << imgName
+ << "\" border=\"0\" alt=\"\" usemap=\"#"
+ << mapLabel << "\"/>" << endl;
+ if (regenerate || !insertMapFile(t,absMapName,relPath,mapLabel))
{
- unsetDotFontPath();
- return baseName;
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapLabel);
+ t << "<!-- MAP " << mapId << " -->" << endl;
}
- int width,height;
- if (!readBoundingBoxEPS(absBaseName+".eps",&width,&height))
- {
- err("Error: Could not extract bounding box from .eps!\n");
- unsetDotFontPath();
- return baseName;
- }
- int maxWidth = 420; /* approx. page width in points */
- t << "\\nopagebreak\n"
- "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
+ t << "</td></tr></table></center>" << endl;
}
- if (Config_getBool("DOT_CLEANUP"))
+ else if (format==EPS)
{
- d.remove(baseName+".dot");
+ if (regenerate || !writeVecGfxFigure(t,baseName,absBaseName))
+ {
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ t << endl << "% FIG " << figId << endl;
+ }
}
- unsetDotFontPath();
return baseName;
}
diff --git a/src/dot.h b/src/dot.h
index 52e7e76..19f5ae4 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -22,6 +22,10 @@
#include "qtbc.h"
#include <qlist.h>
#include <qdict.h>
+#include <qwaitcondition.h>
+#include <qmutex.h>
+#include <qqueue.h>
+#include <qthread.h>
#include "sortdict.h"
class ClassDef;
@@ -34,6 +38,7 @@ class Definition;
class DirDef;
class GroupDef;
class DotGroupCollaboration;
+class DotRunnerQueue;
enum GraphOutputFormat { BITMAP , EPS };
@@ -139,7 +144,7 @@ class DotGfxHierarchyTable
public:
DotGfxHierarchyTable();
~DotGfxHierarchyTable();
- void writeGraph(FTextStream &t,const char *path) const;
+ void writeGraph(FTextStream &t,const char *path,const char *fileName) const;
private:
void addHierarchy(DotNode *n,ClassDef *cd,bool hide);
@@ -160,7 +165,8 @@ class DotClassGraph
bool isTrivial() const;
bool isTooBig() const;
QCString writeGraph(FTextStream &t,GraphOutputFormat f,const char *path,
- const char *relPath, bool TBRank=TRUE,bool imageMap=TRUE) const;
+ const char *fileName, const char *relPath,
+ bool TBRank=TRUE,bool imageMap=TRUE) const;
void writeXML(FTextStream &t);
void writeDEF(FTextStream &t);
@@ -188,8 +194,8 @@ class DotInclDepGraph
public:
DotInclDepGraph(FileDef *fd,bool inverse);
~DotInclDepGraph();
- QCString writeGraph(FTextStream &t, GraphOutputFormat f,const char *path,
- const char *relPath,
+ QCString writeGraph(FTextStream &t, GraphOutputFormat f,
+ const char *path,const char *fileName,const char *relPath,
bool writeImageMap=TRUE) const;
bool isTrivial() const;
bool isTooBig() const;
@@ -216,7 +222,8 @@ class DotCallGraph
DotCallGraph(MemberDef *md,bool inverse);
~DotCallGraph();
QCString writeGraph(FTextStream &t, GraphOutputFormat f,
- const char *path,const char *relPath,bool writeImageMap=TRUE) const;
+ const char *path,const char *fileName,
+ const char *relPath,bool writeImageMap=TRUE) const;
void buildGraph(DotNode *n,MemberDef *md,int distance);
bool isTrivial() const;
bool isTooBig() const;
@@ -244,6 +251,7 @@ class DotDirDeps
QCString writeGraph(FTextStream &out,
GraphOutputFormat format,
const char *path,
+ const char *fileName,
const char *relPath,
bool writeImageMap=TRUE) const;
private:
@@ -290,7 +298,7 @@ class DotGroupCollaboration
DotGroupCollaboration(GroupDef* gd);
~DotGroupCollaboration();
QCString writeGraph(FTextStream &t, GraphOutputFormat format,
- const char *path,const char *relPath,
+ const char *path,const char *fileName,const char *relPath,
bool writeImageMap=TRUE) const;
void buildGraph(GroupDef* gd);
bool isTrivial() const;
@@ -314,7 +322,8 @@ class DotRunner
{
public:
/** Creates a runner for a dot \a file. */
- DotRunner(const char *file);
+ DotRunner(const QCString &file,const QCString &fontPath,bool checkResult,
+ const QCString &imageName = QCString());
/** Adds an additional job to the run.
* Performing multiple jobs one file can be faster.
@@ -323,6 +332,8 @@ class DotRunner
void addPostProcessing(const char *cmd,const char *args);
+ void preventCleanUp() { m_cleanUp = FALSE; }
+
/** Runs dot for all jobs added. */
bool run();
private:
@@ -330,6 +341,79 @@ class DotRunner
QCString m_postArgs;
QCString m_postCmd;
QCString m_file;
+ QCString m_path;
+ bool m_checkResult;
+ QCString m_imageName;
+ bool m_cleanUp;
+};
+
+/** @brief Helper class to insert a set of map file into an output file */
+class DotMapConverter
+{
+ public:
+ struct Map
+ {
+ QCString mapFile;
+ QCString relPath;
+ bool urlOnly;
+ QCString context;
+ QCString label;
+ };
+ DotMapConverter(const char *patchFile);
+ int addMap(const QCString &mapFile,const QCString &relPath,
+ bool urlOnly,const QCString &context,const QCString &label);
+ int addFigure(const QCString &baseName,
+ const QCString &figureName,bool heightCheck);
+ bool run();
+
+ private:
+ QList<Map> m_maps;
+ QCString m_patchFile;
+};
+
+class DotRunnerQueue
+{
+ public:
+ void enqueue(DotRunner *runner);
+ DotRunner *dequeue();
+ uint count() const;
+ private:
+ QWaitCondition m_bufferNotEmpty;
+ QQueue<DotRunner> m_queue;
+ mutable QMutex m_mutex;
+};
+
+class DotWorkerThread : public QThread
+{
+ public:
+ DotWorkerThread(int id,DotRunnerQueue *queue);
+ void run();
+ private:
+ int m_id;
+ DotRunnerQueue *m_queue;
+};
+
+/** @brief singleton that manages dot relation actions */
+class DotManager
+{
+ public:
+ static DotManager *instance();
+ void addRun(DotRunner *run);
+ int addMap(const QCString &file,const QCString &mapFile,
+ const QCString &relPath,bool urlOnly,
+ const QCString &context,const QCString &label);
+ int addFigure(const QCString &file,const QCString &baseName,
+ const QCString &figureName,bool heightCheck);
+ bool run();
+
+ private:
+ DotManager();
+ virtual ~DotManager();
+ QList<DotRunner> m_dotRuns;
+ SDict<DotMapConverter> m_dotMaps;
+ static DotManager *m_theInstance;
+ DotRunnerQueue *m_queue;
+ QList<DotWorkerThread> m_workers;
};
@@ -339,7 +423,7 @@ void generateGraphLegend(const char *path);
void writeDotGraphFromFile(const char *inFile,const char *outDir,
const char *outFile,GraphOutputFormat format);
QCString getDotImageMapFromFile(const QCString& inFile, const QCString& outDir,
- const QCString& relPath,const QCString &context);
+ const QCString& relPath,const QCString& context);
void writeDotDirDepGraph(FTextStream &t,DirDef *dd);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 2efc9ed..6a288ad 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -4968,16 +4968,19 @@ static bool findGlobalMember(EntryNav *rootNav,
{
QCString fullFuncDecl=decl;
if (root->argList) fullFuncDecl+=argListToString(root->argList,TRUE);
- warn(root->fileName,root->startLine,
- "Warning: no matching file member found for \n%s",fullFuncDecl.data());
+ QCString warnMsg =
+ QCString("Warning: no matching file member found for \n")+fullFuncDecl;
if (mn->count()>0)
{
- warn_cont("Possible candidates:\n");
+ warnMsg+="Possible candidates:\n";
for (mni.toFirst();(md=mni.current());++mni)
{
- warn_cont(" %s\n",md->declaration());
+ warnMsg+=" ";
+ warnMsg+=md->declaration();
+ warnMsg+='\n';
}
}
+ warn(root->fileName,root->startLine,warnMsg);
}
}
else // got docs for an undefined member!
@@ -5638,10 +5641,9 @@ static void findMember(EntryNav *rootNav,
}
}
- warn(root->fileName,root->startLine,
- "Warning: no %smatching class member found for",
- noMatchCount>1 ? "uniquely " : ""
- );
+ QCString warnMsg = "Warning: no ";
+ if (noMatchCount>1) warnMsg+="uniquely ";
+ warnMsg+="matching class member found for \n";
if (root->tArgLists)
{
@@ -5649,17 +5651,21 @@ static void findMember(EntryNav *rootNav,
ArgumentList *al;
for (;(al=alli.current());++alli)
{
- warn_cont(" template %s\n",tempArgListToString(al).data());
+ warnMsg+=" template ";
+ warnMsg+=tempArgListToString(al);
+ warnMsg+='\n';
}
}
QCString fullFuncDecl=funcDecl.copy();
if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
- warn_cont(" %s\n",fullFuncDecl.data());
+ warnMsg+=" ";
+ warnMsg+=fullFuncDecl;
+ warnMsg+='\n';
if (candidates>0)
{
- warn_cont("Possible candidates:\n");
+ warnMsg+="Possible candidates:\n";
for (mni.toFirst();(md=mni.current());++mni)
{
ClassDef *cd=md->getClassDef();
@@ -5668,21 +5674,33 @@ static void findMember(EntryNav *rootNav,
LockingPtr<ArgumentList> templAl = md->templateArguments();
if (templAl!=0)
{
- warn_cont(" template %s\n",tempArgListToString(templAl.pointer()).data());
+ warnMsg+=" template ";
+ warnMsg+=tempArgListToString(templAl.pointer());
+ warnMsg+='\n';
}
- warn_cont(" ");
+ warnMsg+=" ";
if (md->typeString())
{
- warn_cont("%s ",md->typeString());
+ warnMsg+=md->typeString();
+ warnMsg+=' ';
}
QCString qScope = cd->qualifiedNameWithTemplateParameters();
- if (!qScope.isEmpty()) warn_cont("%s::%s",qScope.data(),md->name().data());
- if (md->argsString()) warn_cont("%s",md->argsString());
- if (noMatchCount>1) warn_cont(" at line %d of file %s",md->getDefLine(),md->getDefFileName().data());
- warn_cont("\n");
+ if (!qScope.isEmpty())
+ warnMsg+=qScope+"::"+md->name();
+ if (md->argsString())
+ warnMsg+=md->argsString();
+ if (noMatchCount>1)
+ {
+ QCString lineFile;
+ lineFile.sprintf(" at line %d of file ",md->getDefLine());
+ warnMsg+=lineFile+md->getDefFileName();
+ }
+
+ warnMsg+='\n';
}
}
}
+ warn(root->fileName,root->startLine,warnMsg);
}
}
else if (cd) // member specialization
@@ -10419,15 +10437,6 @@ void generateOutput()
//writeDirDependencyGraph(Config_getString("HTML_OUTPUT"));
- if (Config_getBool("GENERATE_RTF"))
- {
- msg("Combining RTF output...\n");
- if (!RTFGenerator::preProcessFileInplace(Config_getString("RTF_OUTPUT"),"refman.rtf"))
- {
- err("An error occurred during post-processing the RTF files!\n");
- }
- }
-
if (Doxygen::formulaList.count()>0 && Config_getBool("GENERATE_HTML"))
{
msg("Generating bitmaps for formulas in HTML...\n");
@@ -10484,10 +10493,12 @@ void generateOutput()
msg("Running html help compiler...\n");
QString oldDir = QDir::currentDirPath();
QDir::setCurrent(Config_getString("HTML_OUTPUT"));
+ portable_sysTimerStart();
if (portable_system(Config_getString("HHC_LOCATION"), "index.hhp", FALSE))
{
err("Error: failed to run html help compiler on index.hhp\n");
}
+ portable_sysTimerStop();
QDir::setCurrent(oldDir);
}
if ( Config_getBool("GENERATE_HTML") &&
@@ -10501,10 +10512,12 @@ void generateOutput()
QCString const args = QCString().sprintf("%s -o \"%s\"", qhpFileName.data(), qchFileName.data());
QString const oldDir = QDir::currentDirPath();
QDir::setCurrent(Config_getString("HTML_OUTPUT"));
+ portable_sysTimerStart();
if (portable_system(Config_getString("QHG_LOCATION"), args.data(), FALSE))
{
err("Error: failed to run qhelpgenerator on index.qhp\n");
}
+ portable_sysTimerStop();
QDir::setCurrent(oldDir);
}
@@ -10515,6 +10528,17 @@ void generateOutput()
Doxygen::searchIndex->write(Config_getString("HTML_OUTPUT")+"/search/search.idx");
}
+ if (Config_getBool("GENERATE_RTF"))
+ {
+ msg("Combining RTF output...\n");
+ if (!RTFGenerator::preProcessFileInplace(Config_getString("RTF_OUTPUT"),"refman.rtf"))
+ {
+ err("An error occurred during post-processing the RTF files!\n");
+ }
+ }
+
+ DotManager::instance()->run();
+
if (Debug::isFlagSet(Debug::Time))
{
msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n",
diff --git a/src/doxygen.css b/src/doxygen.css
index bbb8368..035445f 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -138,7 +138,7 @@ dl.el {
pre.fragment {
border: 1px solid ##CC;
- background-color: ##f5;
+ background-color: ##FC;
padding: 4px 6px;
margin: 4px 8px 4px 2px;
overflow: auto;
@@ -400,44 +400,44 @@ table.memberdecls {
}
.memproto {
- border-top: 1px solid ##80;
- border-left: 1px solid ##80;
- border-right: 1px solid ##80;
- padding: 0;
- background-color: ##c8;
+ border-top: 1px solid ##B4;
+ border-left: 1px solid ##B4;
+ border-right: 1px solid ##B4;
+ padding: 6px 0px 6px 0px;
color: ##2b;
font-weight: bold;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
/* firefox specific markup */
- background-image: -moz-linear-gradient(center top, ##F8, ##E8 30%, ##E0 90%, ##D0);
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
-moz-border-radius-topright: 8px;
-moz-border-radius-topleft: 8px;
/* webkit specific markup */
- background-image: -webkit-gradient(linear,center top,center bottom,from(##F8),color-stop(0.3,##E0),color-stop(0.9,##E0),to(##D0));
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
-webkit-border-top-right-radius: 8px;
-webkit-border-top-left-radius: 8px;
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: ##E6;
}
.memdoc {
- border-bottom: 1px solid ##80;
- border-left: 1px solid ##80;
- border-right: 1px solid ##80;
+ border-bottom: 1px solid ##B4;
+ border-left: 1px solid ##B4;
+ border-right: 1px solid ##B4;
padding: 2px 5px;
- background-color: ##E0;
+ background-color: ##FC;
border-top-width: 0;
/* firefox specific markup */
-moz-border-radius-bottomleft: 8px;
-moz-border-radius-bottomright: 8px;
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
- background-image: -moz-linear-gradient(center top, ##FF 0%, ##F8 80%, ##F0);
+ background-image: -moz-linear-gradient(center top, ##FF 0%, ##FF 60%, #F8 95%, #F0);
/* webkit specific markup */
-webkit-border-bottom-left-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
- background-image: -webkit-gradient(linear,center top,center bottom,from(##FF), color-stop(0.2,##F8), to(##F0));
+ background-image: -webkit-gradient(linear,center top,center bottom,from(##FF), color-stop(0.6,##FF), color-stop(0.60,#FF), color-stop(0.95,#F8), to(#F0));
}
.paramkey {
diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in
index 4d55180..be3c41c 100644
--- a/src/doxygen.pro.in
+++ b/src/doxygen.pro.in
@@ -18,15 +18,15 @@ TEMPLATE = app.t
CONFIG = console warn_on $extraopts
HEADERS = doxygen.h
SOURCES = main.cpp
-unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5
+unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
win32:INCLUDEPATH += .
-win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5
+win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
win32-msvc:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
win32-borland:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
win32:TMAKE_CXXFLAGS += -DQT_NODLL
-win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv
+win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread
win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
INCLUDEPATH += ../qtools ../libmd5 .
DESTDIR = ../bin
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
index fc02e37..a9a2d0d 100644
--- a/src/doxygen_css.h
+++ b/src/doxygen_css.h
@@ -138,7 +138,7 @@
"\n"
"pre.fragment {\n"
" border: 1px solid ##CC;\n"
-" background-color: ##f5;\n"
+" background-color: ##FC;\n"
" padding: 4px 6px;\n"
" margin: 4px 8px 4px 2px;\n"
" overflow: auto;\n"
@@ -400,44 +400,44 @@
"}\n"
"\n"
".memproto {\n"
-" border-top: 1px solid ##80;\n"
-" border-left: 1px solid ##80;\n"
-" border-right: 1px solid ##80;\n"
-" padding: 0;\n"
-" background-color: ##c8;\n"
+" border-top: 1px solid ##B4;\n"
+" border-left: 1px solid ##B4;\n"
+" border-right: 1px solid ##B4;\n"
+" padding: 6px 0px 6px 0px;\n"
" color: ##2b;\n"
" font-weight: bold;\n"
" text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);\n"
" /* firefox specific markup */\n"
-" background-image: -moz-linear-gradient(center top, ##F8, ##E8 30%, ##E0 90%, ##D0);\n"
" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n"
" -moz-border-radius-topright: 8px;\n"
" -moz-border-radius-topleft: 8px;\n"
" /* webkit specific markup */\n"
-" background-image: -webkit-gradient(linear,center top,center bottom,from(##F8),color-stop(0.3,##E0),color-stop(0.9,##E0),to(##D0));\n"
" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
" -webkit-border-top-right-radius: 8px;\n"
" -webkit-border-top-left-radius: 8px;\n"
+" background-image:url('nav_f.png');\n"
+" background-repeat:repeat-x;\n"
+" background-color: ##E6;\n"
"\n"
"}\n"
"\n"
".memdoc {\n"
-" border-bottom: 1px solid ##80; \n"
-" border-left: 1px solid ##80; \n"
-" border-right: 1px solid ##80; \n"
+" border-bottom: 1px solid ##B4; \n"
+" border-left: 1px solid ##B4; \n"
+" border-right: 1px solid ##B4; \n"
" padding: 2px 5px;\n"
-" background-color: ##E0;\n"
+" background-color: ##FC;\n"
" border-top-width: 0;\n"
" /* firefox specific markup */\n"
" -moz-border-radius-bottomleft: 8px;\n"
" -moz-border-radius-bottomright: 8px;\n"
" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n"
-" background-image: -moz-linear-gradient(center top, ##FF 0%, ##F8 80%, ##F0);\n"
+" background-image: -moz-linear-gradient(center top, ##FF 0%, ##FF 60%, #F8 95%, #F0);\n"
" /* webkit specific markup */\n"
" -webkit-border-bottom-left-radius: 8px;\n"
" -webkit-border-bottom-right-radius: 8px;\n"
" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
-" background-image: -webkit-gradient(linear,center top,center bottom,from(##FF), color-stop(0.2,##F8), to(##F0));\n"
+" background-image: -webkit-gradient(linear,center top,center bottom,from(##FF), color-stop(0.6,##FF), color-stop(0.60,#FF), color-stop(0.95,#F8), to(#F0));\n"
"}\n"
"\n"
".paramkey {\n"
diff --git a/src/formula.cpp b/src/formula.cpp
index d0e3843..149c06f 100644
--- a/src/formula.cpp
+++ b/src/formula.cpp
@@ -105,6 +105,7 @@ void FormulaList::generateBitmaps(const char *path)
//system("latex _formulas.tex </dev/null >/dev/null");
QCString latexCmd = Config_getString("LATEX_CMD_NAME");
if (latexCmd.isEmpty()) latexCmd="latex";
+ portable_sysTimerStart();
if (portable_system(latexCmd,"_formulas.tex")!=0)
{
err("Problems running latex. Check your installation or look "
@@ -112,6 +113,7 @@ void FormulaList::generateBitmaps(const char *path)
formulaError=TRUE;
//return;
}
+ portable_sysTimerStop();
//printf("Running dvips...\n");
QListIterator<int> pli(pagesToGenerate);
int *pagePtr;
@@ -127,11 +129,14 @@ void FormulaList::generateBitmaps(const char *path)
// encapsulated postscript.
sprintf(dviArgs,"-q -D 600 -E -n 1 -p %d -o %s.eps _formulas.dvi",
pageIndex,formBase.data());
+ portable_sysTimerStart();
if (portable_system("dvips",dviArgs)!=0)
{
err("Problems running dvips. Check your installation!\n");
+ portable_sysTimerStop();
return;
}
+ portable_sysTimerStop();
// now we read the generated postscript file to extract the bounding box
QFileInfo fi(formBase+".eps");
if (fi.exists())
@@ -184,11 +189,14 @@ void FormulaList::generateBitmaps(const char *path)
gx,gy,(int)(scaleFactor*72),(int)(scaleFactor*72),
formBase.data(),formBase.data()
);
+ portable_sysTimerStart();
if (portable_system(portable_ghostScriptCommand(),gsArgs)!=0)
{
err("Problem running ghostscript %s %s. Check your installation!\n",portable_ghostScriptCommand(),gsArgs);
+ portable_sysTimerStop();
return;
}
+ portable_sysTimerStop();
f.setName(formBase+".pnm");
uint imageX=0,imageY=0;
// we read the generated image again, to obtain the pixel data.
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index c23baed..d888d31 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -480,7 +480,6 @@ void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,int level)
void FTVHelp::generateLink(FTextStream &t,FTVNode *n)
{
- QCString *dest;
//printf("FTVHelp::generateLink(ref=%s,file=%s,anchor=%s\n",
// n->ref.data(),n->file.data(),n->anchor.data());
if (n->file.isEmpty()) // no link
@@ -492,19 +491,14 @@ void FTVHelp::generateLink(FTextStream &t,FTVNode *n)
if (!n->ref.isEmpty()) // link to entity imported via tag file
{
t << "<a class=\"elRef\" ";
- t << "target=\"_blank\" doxygen=\"" << n->ref << ":";
- if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
- t << "\" ";
+ t << externalLinkTarget() << externalRef("",n->ref,FALSE);
}
else // local link
{
t << "<a class=\"el\" ";
}
t << "href=\"";
- if (!n->ref.isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
- }
+ t << externalRef("",n->ref,TRUE);
t << n->file << Doxygen::htmlFileExtension;
if (!n->anchor.isEmpty()) t << "#" << n->anchor;
if (m_topLevelIndex)
diff --git a/src/htags.cpp b/src/htags.cpp
index 7458f0c..9f45163 100644
--- a/src/htags.cpp
+++ b/src/htags.cpp
@@ -90,7 +90,9 @@ bool Htags::execute(const QCString &htmldir)
QCString oldDir = convertToQCString(QDir::currentDirPath());
QDir::setCurrent(g_inputDir.absPath());
//printf("CommandLine=[%s]\n",commandLine.data());
+ portable_sysTimerStart();
bool result=portable_system("htags",commandLine,FALSE)==0;
+ portable_sysTimerStop();
QDir::setCurrent(oldDir);
return result;
}
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index b03fd68..790a59e 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -1510,23 +1510,14 @@ void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
if (!ref.isEmpty()) // link to entity imported via tag file
{
m_t << "<a class=\"elRef\" ";
- m_t << "target=\"_blank\" doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/";
- m_t << "\" ";
+ m_t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
}
else // local link
{
m_t << "<a class=\"el\" ";
}
m_t << "href=\"";
- if (!ref.isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/";
- }
- else
- {
- m_t << relPath;
- }
+ m_t << externalRef(relPath,ref,TRUE);
if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
if (!anchor.isEmpty()) m_t << "#" << anchor;
m_t << "\"";
@@ -1552,22 +1543,22 @@ void HtmlDocVisitor::popEnabled()
delete v;
}
-void HtmlDocVisitor::writeDotFile(const QCString &fileName,const QCString &relPath,
+void HtmlDocVisitor::writeDotFile(const QCString &fn,const QCString &relPath,
const QCString &context)
{
- QCString baseName=fileName;
+ QCString baseName=fn;
int i;
if ((i=baseName.findRev('/'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
}
QCString outDir = Config_getString("HTML_OUTPUT");
- writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
+ writeDotGraphFromFile(fn,outDir,baseName,BITMAP);
QCString mapName = baseName+".map";
- QCString mapFile = fileName+".map";
+ QCString mapFile = fn+".map";
m_t << "<img src=\"" << relPath << baseName << "."
- << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
- << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
+ << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
+ << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
QCString imap = getDotImageMapFromFile(baseName,outDir,relPath,context);
m_t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl;
}
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index a07619d..f084228 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -89,6 +89,18 @@ static unsigned char header_png[12] =
245, 246, 247, 248, 249, 250
};
+// function header
+static unsigned char func_header_png[56] =
+{
+ 248, 247, 246, 245, 244, 243, 242, 241,
+ 240, 239, 238, 237, 236, 235, 234, 233,
+ 232, 231, 230, 229, 228, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223,
+ 224, 224, 224, 224, 225, 225, 225, 225,
+ 225, 226, 226, 226, 227, 227, 227, 227,
+ 228, 228, 228, 229, 229, 229, 229, 229
+};
+
// hovering
static unsigned char tab_h_png[36] =
{
@@ -705,7 +717,8 @@ static colored_img_data_item colored_tab_data[] =
{ "tab_b.png", 1, 36, tab_b_png, 0 },
{ "tab_h.png", 1, 36, tab_h_png, 0 },
{ "tab_s.png", 1, 36, tab_s_png, 0 },
- { "nav_h.png", 1, 12, header_png, 0 },
+ { "nav_h.png", 1, 12, header_png, 0 },
+ { "nav_f.png", 1, 56, func_header_png, 0 },
{ "bc_s.png", 8, 32, bc_s_png, bc_s_a_png },
{ "doxygen.png", 104,31, doxygen_png, doxygen_a_png },
{ "closed.png", 9, 9, closed_png, closed_a_png },
@@ -1265,29 +1278,19 @@ void HtmlGenerator::endIndexListItem()
void HtmlGenerator::startIndexItem(const char *ref,const char *f)
{
//printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f);
- QCString *dest;
if (ref || f)
{
if (ref)
{
t << "<a class=\"elRef\" ";
- t << "target=\"_blank\" doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
}
else
{
t << "<a class=\"el\" ";
}
t << "href=\"";
- if (ref)
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- }
- else
- {
- t << relPath;
- }
+ t << externalRef(relPath,ref,TRUE);
if (f) t << f << Doxygen::htmlFileExtension << "\">";
}
else
@@ -1322,27 +1325,17 @@ void HtmlGenerator::writeStartAnnoItem(const char *,const char *f,
void HtmlGenerator::writeObjectLink(const char *ref,const char *f,
const char *anchor, const char *name)
{
- QCString *dest;
if (ref)
{
t << "<a class=\"elRef\" ";
- t << "target=\"_blank\" doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
}
else
{
t << "<a class=\"el\" ";
}
t << "href=\"";
- if (ref)
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- }
- else
- {
- t << relPath;
- }
+ t << externalRef(relPath,ref,TRUE);
if (f) t << f << Doxygen::htmlFileExtension;
if (anchor) t << "#" << anchor;
t << "\">";
@@ -1354,28 +1347,18 @@ void HtmlGenerator::writeCodeLink(const char *ref,const char *f,
const char *anchor, const char *name,
const char *tooltip)
{
- QCString *dest;
//printf("writeCodeLink(ref=%s,f=%s,anchor=%s,name=%s,tooltip=%s)\n",ref,f,anchor,name,tooltip);
if (ref)
{
t << "<a class=\"codeRef\" ";
- t << "target=\"_blank\" doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
}
else
{
t << "<a class=\"code\" ";
}
t << "href=\"";
- if (ref)
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << relPath << *dest << "/";
- }
- else
- {
- t << relPath;
- }
+ t << externalRef(relPath,ref,TRUE);
if (f) t << f << Doxygen::htmlFileExtension;
if (anchor) t << "#" << anchor;
t << "\"";
@@ -2010,7 +1993,7 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,relPath);
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
if (Config_getBool("GENERATE_LEGEND"))
{
t << "<center><span class=\"legend\">[";
@@ -2036,7 +2019,7 @@ void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,relPath);
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
endSectionContent(t);
m_sectionCount++;
@@ -2054,7 +2037,7 @@ void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,relPath);
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
endSectionContent(t);
m_sectionCount++;
@@ -2072,7 +2055,7 @@ void HtmlGenerator::endCallGraph(const DotCallGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,relPath);
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
endSectionContent(t);
m_sectionCount++;
@@ -2090,7 +2073,7 @@ void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,relPath);
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
endSectionContent(t);
m_sectionCount++;
@@ -2098,7 +2081,7 @@ void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
void HtmlGenerator::writeGraphicalHierarchy(const DotGfxHierarchyTable &g)
{
- g.writeGraph(t,dir);
+ g.writeGraph(t,dir,fileName);
}
void HtmlGenerator::startMemberGroupHeader(bool)
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 731ef2d..a488db2 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -496,6 +496,7 @@ void HtmlHelp::createProjectFile()
t << "tab_h.png" << endl;
t << "tab_s.png" << endl;
t << "nav_h.png" << endl;
+ t << "nav_f.png" << endl;
if (Config_getBool("HTML_DYNAMIC_SECTIONS"))
{
t << "open.gif" << endl;
diff --git a/src/index.cpp b/src/index.cpp
index b385d79..8899d43 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -2643,32 +2643,20 @@ void writeJavascriptSearchIndex()
<< "onkeyup=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
<< "class=\"SRSymbol\" ";
- if (!d->getReference().isEmpty())
- {
- QCString *dest = Doxygen::tagDestinationDict[d->getReference()];
- if (dest && *dest=='.') // relative path (see bug 593679)
- {
- t << "target=\"_blank\" doxygen=\"" << d->getReference() << ":../"
- << *dest << "/\" href=\"../" << *dest << "/";
- }
- else if (dest) // absolute path
- {
- t << "target=\"_blank\" doxygen=\"" << d->getReference() << ":"
- << *dest << "/\" href=\"" << *dest << "/";
- }
- }
- else
- {
- t << "href=\"../";
- }
+ t << externalLinkTarget() << "href=\"" << externalRef("../",d->getReference(),TRUE);
t << d->getOutputFileBase() << Doxygen::htmlFileExtension;
if (isMemberDef)
{
t << "#" << ((MemberDef *)d)->anchor();
}
- t << "\" target=\"";
- if (treeView) t << "basefrm"; else t << "_parent";
- t << "\">";
+ static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW");
+ if (!extLinksInWindow || d->getReference().isEmpty())
+ {
+ t << "\" target=\"";
+ if (treeView) t << "basefrm"; else t << "_parent";
+ t << "\"";
+ }
+ t << ">";
t << convertToXML(d->localName());
t << "</a>" << endl;
if (d->getOuterScope()!=Doxygen::globalScope)
@@ -2733,25 +2721,22 @@ void writeJavascriptSearchIndex()
<< "class=\"SRScope\" ";
if (!d->getReference().isEmpty())
{
- QCString *dest;
- t << "target=\"_blank\" doxygen=\"" << d->getReference() << ":../";
- if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/";
- t << "\" ";
- t << "href=\"../";
- if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/";
- }
- else
- {
- t << "href=\"../";
+ t << externalLinkTarget() << externalRef("../",d->getReference(),FALSE);
}
+ t << "href=\"" << externalRef("../",d->getReference(),TRUE);
t << d->getOutputFileBase() << Doxygen::htmlFileExtension;
if (isMemberDef)
{
t << "#" << ((MemberDef *)d)->anchor();
}
- t << "\" target=\"";
- if (treeView) t << "basefrm"; else t << "_parent";
- t << "\">";
+ static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW");
+ if (!extLinksInWindow || d->getReference().isEmpty())
+ {
+ t << "\" target=\"";
+ if (treeView) t << "basefrm"; else t << "_parent";
+ t << "\"";
+ }
+ t << ">";
bool found=FALSE;
overloadedFunction = ((prevScope!=0 && scope==prevScope) ||
(scope && scope==nextScope)
diff --git a/src/language.cpp b/src/language.cpp
index 90fe85d..b0ab2d5 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -307,7 +307,7 @@ bool setTranslator(const char *langName)
#ifdef LANG_BR
else if (L_EQUAL("brazilian"))
{
- theTranslator=new TranslatorDecoder(new TranslatorBrazilian);
+ theTranslator=new TranslatorBrazilian;
}
#endif
#ifdef LANG_DK
@@ -331,7 +331,7 @@ bool setTranslator(const char *langName)
#ifdef LANG_GR
else if (L_EQUAL("greek"))
{
- theTranslator=new TranslatorDecoder(new TranslatorGreek);
+ theTranslator=new TranslatorGreek;
}
#endif
#ifdef LANG_SR
@@ -408,6 +408,6 @@ bool setTranslator(const char *langName)
}
QCString msg = theTranslator->updateNeededMessage();
- if (!msg.isEmpty()) warn_cont(msg);
+ if (!msg.isEmpty()) err(msg);
return TRUE;
}
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index d848a97..6d562ce 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -546,7 +546,7 @@ static void writeDefaultStyleSheetPart3(FTextStream &t)
"}\n\n";
t << "% is used for parameters within a detailed function description\n"
"\\newenvironment{DoxyParamCaption}{%\n"
- " \\renewcommand{\\item}[2][]{##1 \\em ##2}%\n"
+ " \\renewcommand{\\item}[2][]{##1 {\\em ##2}}%\n"
" }{%\n"
"}\n\n";
t << "% Used by return value lists\n"
@@ -1847,7 +1847,7 @@ void LatexGenerator::startDotGraph()
void LatexGenerator::endDotGraph(const DotClassGraph &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startInclDepGraph()
@@ -1856,7 +1856,7 @@ void LatexGenerator::startInclDepGraph()
void LatexGenerator::endInclDepGraph(const DotInclDepGraph &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startGroupCollaboration()
@@ -1865,7 +1865,7 @@ void LatexGenerator::startGroupCollaboration()
void LatexGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startCallGraph()
@@ -1874,7 +1874,7 @@ void LatexGenerator::startCallGraph()
void LatexGenerator::endCallGraph(const DotCallGraph &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startDirDepGraph()
@@ -1883,7 +1883,7 @@ void LatexGenerator::startDirDepGraph()
void LatexGenerator::endDirDepGraph(const DotDirDeps &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startDescription()
@@ -1955,6 +1955,10 @@ void LatexGenerator::startParameterList(bool openBracket)
t << endl << "\\begin{DoxyParamCaption}" << endl;
}
+void LatexGenerator::endParameterList()
+{
+}
+
void LatexGenerator::startParameterType(bool /*first*/,const char *key)
{
diff --git a/src/latexgen.h b/src/latexgen.h
index 6ba7c79..f846ca3 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -221,7 +221,7 @@ class LatexGenerator : public OutputGenerator
void startParameterName(bool);
void endParameterName(bool,bool,bool);
void startParameterList(bool);
- void endParameterList() {}
+ void endParameterList();
void startConstraintList(const char *);
void startConstraintParam();
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index e7fa89e..3c6dfd2 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -146,12 +146,18 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
//if (!md->isDefine()) ol.startParameter(TRUE); else ol.docify(" ");
bool first=TRUE;
bool paramTypeStarted=FALSE;
+ bool isDefine = md->isDefine();
while (a)
{
- if (md->isDefine() || first)
+ if (isDefine || first)
{
ol.startParameterType(first,md->isObjCMethod()?"dummy":0);
paramTypeStarted=TRUE;
+ if (isDefine)
+ {
+ ol.endParameterType();
+ ol.startParameterName(TRUE);
+ }
}
QRegExp re(")("),res("(.*\\*");
int vp=a->type.find(re);
@@ -187,7 +193,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n);
}
}
- if (!md->isDefine())
+ if (!isDefine)
{
if (paramTypeStarted)
{
@@ -243,7 +249,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
if (a)
{
if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
- if (!md->isDefine())
+ if (!isDefine)
{
QCString key;
if (md->isObjCMethod() && a->attrib.length()>=2)
@@ -261,7 +267,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
ol.startParameterType(FALSE,key);
paramTypeStarted=TRUE;
}
- else
+ else // isDefine
{
ol.endParameterName(FALSE,FALSE,TRUE);
}
@@ -276,17 +282,16 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
ol.enableAll();
if (htmlOn) ol.enable(OutputGenerator::Html);
if (latexOn) ol.enable(OutputGenerator::Latex);
- if (!md->isDefine())
+ //if (!isDefine)
{
if (first) ol.startParameterName(defArgList->count()<2);
ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod());
}
- else
- {
- ol.endParameterType();
- ol.startParameterName(TRUE);
- ol.endParameterName(TRUE,TRUE,!md->isObjCMethod());
- }
+ //else // isDefine
+ //{
+ // if (first) ol.startParameterName(TRUE);
+ // ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod());
+ //}
ol.popGeneratorState();
if (md->extraTypeChars())
{
diff --git a/src/message.cpp b/src/message.cpp
index 96f1cfd..8669650 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -161,16 +161,6 @@ void warn(const char *file,int line,const char *fmt, ...)
va_end(args);
}
-void warn_cont(const char *fmt, ...)
-{
- if (!Config_getBool("WARNINGS"))
- return;
- va_list args;
- va_start(args, fmt);
- vfprintf(warnFile, fmt, args);
- va_end(args);
-}
-
void warn_undoc(const char *file,int line,const char *fmt, ...)
{
va_list args;
diff --git a/src/message.h b/src/message.h
index 8e205fa..5a42d50 100644
--- a/src/message.h
+++ b/src/message.h
@@ -22,7 +22,6 @@
extern void msg(const char *fmt, ...);
extern void warn(const char *file,int line,const char *fmt, ...);
-extern void warn_cont(const char *fmt, ...);
extern void warn_undoc(const char *file,int line,const char *fmt, ...);
extern void warn_doc_error(const char *file,int line,const char *fmt, ...);
extern void err(const char *fmt, ...);
diff --git a/src/msc.cpp b/src/msc.cpp
index 72f9681..d844b32 100644
--- a/src/msc.cpp
+++ b/src/msc.cpp
@@ -68,13 +68,9 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel
if ( isRef )
{
// handle doxygen \ref tag URL reference
- QCString *dest;
DocRef *df = new DocRef( (DocNode*) 0, url, context );
- if (!df->ref().isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[df->ref()])) t << *dest << "/";
- }
- if (!df->file().isEmpty()) t << relPath << df->file() << Doxygen::htmlFileExtension;
+ t << externalRef(relPath,df->ref(),TRUE);
+ if (!df->file().isEmpty()) t << df->file() << Doxygen::htmlFileExtension;
if (!df->anchor().isEmpty()) t << "#" << df->anchor();
}
else
@@ -121,19 +117,24 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir,
mscArgs+=extension+"\"";
int exitCode;
//printf("*** running: %s %s\n",mscExe.data(),mscArgs.data());
+ portable_sysTimerStart();
if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
{
+ portable_sysTimerStop();
goto error;
}
+ portable_sysTimerStop();
if ( (format==MSC_EPS) && (Config_getBool("USE_PDFLATEX")) )
{
QCString epstopdfArgs(maxCmdLine);
epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
outFile,outFile);
+ portable_sysTimerStart();
if (portable_system("epstopdf",epstopdfArgs)!=0)
{
err("Error: Problems running epstopdf. Check your TeX installation!\n");
}
+ portable_sysTimerStop();
}
error:
@@ -157,11 +158,14 @@ QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir,
mscArgs+=outFile + "\"";
int exitCode;
+ portable_sysTimerStart();
if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
{
+ portable_sysTimerStop();
QDir::setCurrent(oldDir);
return "";
}
+ portable_sysTimerStop();
QString result;
QTextOStream tmpout(&result);
diff --git a/src/outputgen.cpp b/src/outputgen.cpp
index 4e91156..2216bca 100644
--- a/src/outputgen.cpp
+++ b/src/outputgen.cpp
@@ -41,7 +41,7 @@ OutputGenerator::~OutputGenerator()
void OutputGenerator::startPlainFile(const char *name)
{
//printf("startPlainFile(%s)\n",name);
- QCString fileName=dir+"/"+name;
+ fileName=dir+"/"+name;
file = new QFile(fileName);
if (!file)
{
@@ -60,6 +60,7 @@ void OutputGenerator::endPlainFile()
{
delete file;
file=0;
+ fileName.resize(0);
}
void OutputGenerator::pushGeneratorState()
diff --git a/src/outputgen.h b/src/outputgen.h
index 82b6c38..b3e7745 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -408,6 +408,7 @@ class OutputGenerator : public BaseOutputDocInterface
protected:
FTextStream t;
QFile *file;
+ QCString fileName;
QCString dir;
bool active;
QStack<bool> *genStack;
diff --git a/src/portable.cpp b/src/portable.cpp
index 41eff1c..eee8239 100644
--- a/src/portable.cpp
+++ b/src/portable.cpp
@@ -27,11 +27,10 @@ extern char **environ;
//#include "doxygen.h"
static double sysElapsedTime;
+static QTime time;
int portable_system(const char *command,const char *args,bool commandHasConsole)
{
- QTime time;
- time.start();
if (command==0) return 1;
@@ -79,7 +78,6 @@ int portable_system(const char *command,const char *args,bool commandHasConsole
}
}
}
- sysElapsedTime+=((double)time.elapsed())/1000.0;
return status;
#else // Other Unices just use fork
@@ -104,7 +102,6 @@ int portable_system(const char *command,const char *args,bool commandHasConsole
}
else
{
- sysElapsedTime+=((double)time.elapsed())/1000.0;
if (WIFEXITED(status))
{
return WEXITSTATUS(status);
@@ -158,7 +155,6 @@ int portable_system(const char *command,const char *args,bool commandHasConsole
CloseHandle(sInfo.hProcess);
}
}
- sysElapsedTime+=((double)time.elapsed())/1000.0;
return 0;
#endif
@@ -369,8 +365,26 @@ int portable_pclose(FILE *stream)
return pclose(stream);
}
+void portable_sysTimerStart()
+{
+ time.start();
+}
+
+void portable_sysTimerStop()
+{
+ sysElapsedTime+=((double)time.elapsed())/1000.0;
+}
+
double portable_getSysElapsedTime()
{
return sysElapsedTime;
}
+void portable_sleep(int ms)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ Sleep(ms);
+#else
+ usleep(1000*ms);
+#endif
+}
diff --git a/src/portable.h b/src/portable.h
index 0718932..cbd8df0 100644
--- a/src/portable.h
+++ b/src/portable.h
@@ -28,7 +28,10 @@ const char * portable_commandExtension();
bool portable_fileSystemIsCaseSensitive();
FILE * portable_popen(const char *name,const char *type);
int portable_pclose(FILE *stream);
+void portable_sysTimerStart();
+void portable_sysTimerStop();
double portable_getSysElapsedTime();
+void portable_sleep(int ms);
extern "C" {
void * portable_iconv_open(const char* tocode, const char* fromcode);
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 1ab36ce..b86fe4e 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -1994,7 +1994,7 @@ void RTFGenerator::incrementIndentLevel()
m_listLevel++;
if (m_listLevel>rtf_maxIndentLevels-1)
{
- warn_cont("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
+ err("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
m_listLevel=rtf_maxIndentLevels-1;
}
}
@@ -2004,7 +2004,7 @@ void RTFGenerator::decrementIndentLevel()
m_listLevel--;
if (m_listLevel<0)
{
- warn_cont("Warning: Negative indent level while generating RTF output!\n");
+ err("Warning: Negative indent level while generating RTF output!\n");
m_listLevel=0;
}
}
@@ -2351,7 +2351,7 @@ void RTFGenerator::endDotGraph(const DotClassGraph &g)
newParagraph();
QCString fileName =
- g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),relPath,TRUE,FALSE);
+ g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE);
// display the file
t << "{" << endl;
@@ -2373,14 +2373,14 @@ void RTFGenerator::endInclDepGraph(const DotInclDepGraph &g)
{
newParagraph();
- QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
- relPath,FALSE);
+ QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ fileName,relPath,FALSE);
// display the file
t << "{" << endl;
t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
+ t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT");
t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
t << "}" << endl;
DBG_RTF(t << "{\\comment (endInclDepGraph)}" << endl)
@@ -2403,14 +2403,14 @@ void RTFGenerator::endCallGraph(const DotCallGraph &g)
{
newParagraph();
- QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
- relPath,FALSE);
+ QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ fileName,relPath,FALSE);
// display the file
t << "{" << endl;
t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
+ t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT");
t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
t << "}" << endl;
DBG_RTF(t << "{\\comment (endCallGraph)}" << endl)
@@ -2426,7 +2426,7 @@ void RTFGenerator::endDirDepGraph(const DotDirDeps &g)
newParagraph();
QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
- relPath,FALSE);
+ fileName,relPath,FALSE);
// display the file
t << "{" << endl;
@@ -2631,7 +2631,7 @@ void RTFGenerator::endParamList()
void RTFGenerator::startParameterType(bool first,const char *key)
{
DBG_RTF(t << "{\\comment (startParameterList)}" << endl)
- if (!first)
+ if (!first && key)
{
t << " " << key << " ";
}
diff --git a/src/translator_br.h b/src/translator_br.h
index 850e4dc..787e457 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -10,11 +10,13 @@
* Documents produced by Doxygen are derivative workns derived from the
* input used in their production; they are not affected by this license.
*
- * Brazilian Portuguese translation version 20091215
+ * Brazilian Portuguese translation version 20100531
* Maintainer: Fabio "FJTC" Jun Takada Chino <jun-chino at uol.com.br>
* Thanks to Jorge Ramos, Fernando Carijo and others for their contributions.
*
* History:
+ * 20100531:
+ * - Updated to 1.6.3;
* 20091218:
* - Updated to 1.6.1;
* - Copyright year updated;
@@ -25,17 +27,12 @@
* - Method trTypeContraints() renamed to trTypeConstraints().
* 20071216:
* - New methods since 1.5.4 updated.
- * 20070914
- * - "Translate me" fixed
- * - Revision number changed from doxygen version to a date string.
- * - History cleanup
- * - Latex babel package fixed.
* Previous history removed from this version.
*/
#ifndef TRANSLATOR_BR_H
#define TRANSLATOR_BR_H
-class TranslatorBrazilian : public TranslatorAdapter_1_6_3
+class TranslatorBrazilian : public Translator
{
public:
@@ -1781,7 +1778,6 @@ class TranslatorBrazilian : public TranslatorAdapter_1_6_3
//////////////////////////////////////////////////////////////////////////
/*! directory relation for \a name
- * \todo
*/
virtual QCString trDirRelation(const char *name)
{
@@ -1811,5 +1807,60 @@ class TranslatorBrazilian : public TranslatorAdapter_1_6_3
{
return "Nenhuma entrada encontrada";
}
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Grafo de dependência de diretórios para "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Arquivo em "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Inclui arquivo em "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Segunda","Terça","Quarta","Quinta","Sexta","Sábado","Domingo" };
+ static const char *months[] = { "Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro" };
+ QCString sdate;
+ sdate.sprintf("%s, %d de %s de %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
};
#endif
diff --git a/src/translator_cz.h b/src/translator_cz.h
index a50f40d..e17f5f7 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -20,6 +20,8 @@
// Updates:
// --------
+// 2010/06/01 - typo
+// 2010/04/28 - Updates for "new since 1.6.3".
// 2009/09/02 - Updates for "new since 1.6.0 (mainly for the new search engine)".
// 2008/06/09 - Corrections in trLegendDocs().
// 2007/11/13 - Update for "new since 1.5.4 (mainly for Fortran)".
@@ -79,7 +81,7 @@
// something else. It is difficult to find the general translation
// for all kinds in the Czech language.
-class TranslatorCzech : public TranslatorAdapter_1_6_3
+class TranslatorCzech : public Translator
{
public:
// --- Language control methods -------------------
@@ -1847,6 +1849,61 @@ class TranslatorCzech : public TranslatorAdapter_1_6_3
{
return "Nic se nenašlo";
}
-};
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Graf závislosti adresářů pro "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Soubor v "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Vkládá (include) soubor z "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "po","út","st","čt","pá","so","ne" };
+ static const char *months[] = { "led","úno","bře","dub","kvě","čer","čec","srp","zář","říj","lis","pro" };
+ QCString sdate;
+ sdate.sprintf("%s %d. %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d.%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+};
#endif // TRANSLATOR_CZ_H
diff --git a/src/translator_es.h b/src/translator_es.h
index f15145e..3737578 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -25,12 +25,13 @@
* Updated to 1.5.5 by Bartomeu Creus Navarro (5-febrero-2008)
* Updated to 1.5.8 by Bartomeu Creus Navarro (10-abril-2009)
* Updated to 1.6.3 by Bartomeu Creus Navarro (3-marzo-2010)
+ * Updated to 1.6.4 by Bartomeu Creus Navarro (26-mayo-2010)
*/
#ifndef TRANSLATOR_ES_H
#define TRANSLATOR_ES_H
-class TranslatorSpanish : public TranslatorAdapter_1_6_3
+class TranslatorSpanish : public Translator
{
public:
@@ -1870,6 +1871,65 @@ class TranslatorSpanish : public TranslatorAdapter_1_6_3
return "Nada coincide";
}
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Grfico de dependencias para el directorio "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Fichero en "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Incluye ficheros en "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Lunes","Martes","Mircoles","Jueves",
+ "Viernes","Sbado","Domingo" };
+ static const char *months[] = { "Enero","Febrero","Marzo","Abril",
+ "Mayo","Junio","Julio","Agosto",
+ "Septiembre","Octubre","Noviembre","Diciembre" };
+ QCString sdate;
+ sdate.sprintf("%s, %d de %s de %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
};
#endif
diff --git a/src/translator_gr.h b/src/translator_gr.h
index c47c054..a6044f5 100644
--- a/src/translator_gr.h
+++ b/src/translator_gr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2010 by Dimitri van Heesch.
+ * Copyright (C) 1997-2008 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
@@ -19,14 +19,14 @@
* 15 Dec 2001 : Translation to greek by
* Harry Kalogirou <no email>
*
- * 04 Feb 2006 : Greek maintainance by
- * Paul Gessos <nickreserved@yahoo.com>
+ * 01 Jan 2009 : Greek maintainance by
+ * Paul Gessos <gessos.paul@yahoo.gr>
*/
#ifndef TRANSLATOR_GR_H
#define TRANSLATOR_GR_H
-class TranslatorGreek : public TranslatorAdapter_1_5_4
+class TranslatorGreek : public Translator
{
protected:
friend class TranslatorAdapterBase;
@@ -53,89 +53,89 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! return the language charset. This will be used for the HTML output */
virtual QCString idLanguageCharset()
{
- return "iso-8859-7";
+ return "utf-8";
}
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
virtual QCString trRelatedFunctions()
- { return " "; }
+ { return "Σχετικές συναρτήσεις"; }
/*! subscript for the related functions. */
virtual QCString trRelatedSubscript()
- { return "( .)"; }
+ { return "(Σημειώστε ότι αυτές δεν είναι συναρτήσεις μέλη.)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
virtual QCString trDetailedDescription()
- { return " "; }
+ { return "Λεπτομερής Περιγραφή"; }
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
- { return " Typedef"; }
+ { return "Τεκμηρίωση Μελών Typedef"; }
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Απαριθμήσεων Μελών"; }
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Συναρτήσεων Μελών"; }
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Τεκμηρίωση Πεδίων";
}
else
{
- return " ";
+ return "Τεκμηρίωση Δεδομένων Μελών";
}
}
/*! this is the text of a link put after brief descriptions. */
virtual QCString trMore()
- { return "..."; }
+ { return "Περισσότερα..."; }
/*! put in the class documentation */
virtual QCString trListOfAllMembers()
- { return " ."; }
+ { return "Λίστα όλων των μελών."; }
/*! used as the title of the "list of all members" page of a class */
virtual QCString trMemberList()
- { return " "; }
+ { return "Λίστα μελών"; }
/*! this is the first part of a sentence that is followed by a class name */
virtual QCString trThisIsTheListOfAllMembers()
- { return " "; }
+ { return "Ακολουθεί η πλήρης λίστα των μελών της"; }
/*! this is the remainder of the sentence after the class name */
virtual QCString trIncludingInheritedMembers()
- { return ", ."; }
+ { return ", περιλαμβανομένων όλων των κληρονομημένων μελών."; }
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
*/
virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result=" Doxygen";
- if (s) result+=(QCString)" "+s;
- result+=" .";
+ { QCString result="Δημιουργήθηκε αυτόματα από το Doxygen";
+ if (s) result+=(QCString)" για "+s;
+ result+=" από τον πηγαίο κώδικα.";
return result;
}
/*! put after an enum name in the list of all members */
virtual QCString trEnumName()
- { return " "; }
+ { return "όνομα απαρύθμισης"; }
/*! put after an enum value in the list of all members */
virtual QCString trEnumValue()
- { return " "; }
+ { return "τιμή απαρίθμησης"; }
/*! put after an undocumented member in the list of all members */
virtual QCString trDefinedIn()
- { return " "; }
+ { return "ορισμένο στο "; }
// quick reference sections
@@ -143,43 +143,39 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
- { return ""; }
+ { return "Κομμάτια"; }
/*! This is put above each page as a link to the class hierarchy */
virtual QCString trClassHierarchy()
- { return " "; }
+ { return "Ιεραρχία Κλάσεων"; }
/*! This is put above each page as a link to the list of annotated classes */
virtual QCString trCompoundList()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Δομές Δεδομένων";
}
else
{
- return " ";
+ return "Λίστα Συσσωματωμάτων";
}
}
/*! This is put above each page as a link to the list of documented files */
virtual QCString trFileList()
- { return " "; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return " "; }
+ { return "Λίστα Αρχείων"; }
/*! This is put above each page as a link to all members of compounds. */
virtual QCString trCompoundMembers()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Πεδία Δεδομένων";
}
else
{
- return " ";
+ return "Μέλη Συσσωματώματα";
}
}
@@ -188,38 +184,38 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Καθολικοί ορισμοί";
}
else
{
- return " ";
+ return "Μέλη Αρχείων";
}
}
/*! This is put above each page as a link to all related pages. */
virtual QCString trRelatedPages()
- { return " "; }
+ { return "Σχετικές Σελίδες"; }
/*! This is put above each page as a link to all examples. */
virtual QCString trExamples()
- { return ""; }
+ { return "Παραδείγματα"; }
/*! This is put above each page as a link to the search engine. */
virtual QCString trSearch()
- { return ""; }
+ { return "Αναζήτηση"; }
/*! This is an introduction to the class hierarchy. */
virtual QCString trClassHierarchyDescription()
- { return " , "
- " , :";
+ { return "Αυτή η λίστα κληρονομηκότητας είναι μερικώς ταξινομημένη, "
+ "αλλά όχι πλήρως, αλφαβητικά:";
}
/*! This is an introduction to the list with all files. */
virtual QCString trFileListDescription(bool extractAll)
{
- QCString result=" ";
- if (!extractAll) result+=" ";
- result+=" :";
+ QCString result="Ακολουθεί μια λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
+ result+="αρχείων με σύντομες περιγραφές:";
return result;
}
@@ -229,52 +225,52 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " :";
+ return "Ακολουθούνε οι δομές δεδομένων με σύντομες περιγραφές:";
}
else
{
- return " , , "
- " :";
+ return "Ακολουθούνε οι κλάσεις, οι δομές, "
+ "τα σώματα και οι διαπροσωπίες με σύντομες περιγραφές:";
}
}
/*! This is an introduction to the page with all class members. */
virtual QCString trCompoundMembersDescription(bool extractAll)
{
- QCString result=" ";
+ QCString result="Ακολουθεί η λίστα όλων των ";
if (!extractAll)
{
- result+=" ";
+ result+="τεκμηριωμένων ";
}
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+=" ";
+ result+="πεδίων δομών και σωμάτων ";
}
else
{
- result+="";
+ result+="κλάσεων";
}
- result+=" ";
+ result+=" με συνδέσμους ";
if (!extractAll)
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+=" / :";
+ result+="στην τεκμηρίωση των δομών/ενώσεων για κάθε πεδίο:";
}
else
{
- result+=" :";
+ result+="στην τεκμηρίωση των κλάσεων για κάθε πεδίο:";
}
}
else
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+=" / :";
+ result+="στις δομές/ενώσεις που ανήκουν:";
}
else
{
- result+=" :";
+ result+="στις κλάσεις που ανήκουν:";
}
}
return result;
@@ -283,65 +279,55 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! This is an introduction to the page with all file members. */
virtual QCString trFileMembersDescription(bool extractAll)
{
- QCString result=" ";
- if (!extractAll) result+=" ";
+ QCString result="Ακολουθεί η λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+=", , , , ";
+ result+="συναρτήσεων, μεταβλητών, ορισμών, απαριθμήσεων, και ορισμών τύπων";
}
else
{
- result+=" ";
+ result+="μελών αρχείων";
}
- result+=" ";
+ result+=" με συνδέσμους ";
if (extractAll)
- result+=" :";
+ result+="στα αρχεία που ανήκουν:";
else
- result+=" :";
+ result+="στην τεκμηρίωση:";
return result;
}
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return " API:"; }
-
/*! This is an introduction to the page with the list of all examples */
virtual QCString trExamplesDescription()
- { return " :"; }
+ { return "Ακολουθεί η λίστα με τα παραδείγματα:"; }
/*! This is an introduction to the page with the list of related pages */
virtual QCString trRelatedPagesDescription()
- { return " :"; }
+ { return "Ακολουθεί η λίστα όλων των σχετικών σελίδων τεκμηρίωσης:"; }
/*! This is an introduction to the page with the list of class/file groups */
virtual QCString trModulesDescription()
- { return " :"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return " "; }
+ { return "Ακολουθεί η λίστα όλων των μονάδων:"; }
// index titles (the project name is prepended for these)
/*! This is used in HTML as the title of index.html. */
virtual QCString trDocumentation()
- { return ""; }
+ { return "Τεκμηρίωση"; }
/*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
virtual QCString trModuleIndex()
- { return " "; }
+ { return "Ευρετήριο μονάδων"; }
/*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
- { return " "; }
+ { return "Ιεραρχικό Ευρετήριο"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
@@ -350,11 +336,11 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Ευρετήριο δομών δεδομένων";
}
else
{
- return " ";
+ return "Συμπαγές Ευρετήριο";
}
}
@@ -362,13 +348,13 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* list of all files.
*/
virtual QCString trFileIndex()
- { return " "; }
+ { return "Ευρετήτιο Αρχείων"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
virtual QCString trModuleDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Μονάδων"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
@@ -377,11 +363,11 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Τεκμηρίωση Δομών Δεδομένων";
}
else
{
- return " ";
+ return "Τεκμηρίωση Κλάσεων";
}
}
@@ -389,101 +375,101 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* the documentation of all files.
*/
virtual QCString trFileDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Αρχείων"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
virtual QCString trExampleDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Παραδειγμάτων"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
virtual QCString trPageDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Σελίδων"; }
/*! This is used in LaTeX as the title of the document */
virtual QCString trReferenceManual()
- { return " "; }
+ { return "Ενχειρίδιο Αναφοράς"; }
/*! This is used in the documentation of a file as a header before the
* list of defines
*/
virtual QCString trDefines()
- { return ""; }
+ { return "Ορισμοί"; }
/*! This is used in the documentation of a file as a header before the
* list of function prototypes
*/
virtual QCString trFuncProtos()
- { return " "; }
+ { return "Πρωτοτυπήσεις Συναρτήσεων"; }
/*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
virtual QCString trTypedefs()
- { return " "; }
+ { return "Ορισμοί Τύπων"; }
/*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
virtual QCString trEnumerations()
- { return ""; }
+ { return "Απαριθμήσεις"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
virtual QCString trFunctions()
- { return ""; }
+ { return "Συναρτήσεις"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trVariables()
- { return ""; }
+ { return "Μεταβλητές"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trEnumerationValues()
- { return " "; }
+ { return "Τιμές Απαριθμήσεων"; }
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
virtual QCString trDefineDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Ορισμών"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for function prototypes
*/
virtual QCString trFunctionPrototypeDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Πρωτοτυπήσεων των Συναρτήσεων"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
virtual QCString trTypedefDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Ορισμών Τύπων"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
*/
virtual QCString trEnumerationTypeDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Απαριθμήσεων"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions
*/
virtual QCString trFunctionDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Συναρτήσεων"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
virtual QCString trVariableDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Μεταβλητών"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
@@ -492,11 +478,11 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Δομές Δεδομένων";
}
else
{
- return "";
+ return "Συσσωματώματα";
}
}
@@ -505,67 +491,59 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trGeneratedAt(const char *date,const char *projName)
{
- QCString result=(QCString)" "+date;
- if (projName) result+=(QCString)" "+projName;
- result+=(QCString)" ";
+ QCString result=(QCString)"Δημιουργήθηκε στις "+date;
+ if (projName) result+=(QCString)" για "+projName;
+ result+=(QCString)" από";
return result;
}
/*! This is part of the sentence used in the standard footer of each page.
*/
virtual QCString trWrittenBy()
{
- return " ";
+ return "γραμμένο από τον ";
}
/*! this text is put before a class diagram */
virtual QCString trClassDiagram(const char *clName)
{
- return (QCString)" "+clName+":";
+ return (QCString)"Διάγραμμα κληρονομικότητας για την "+clName+":";
}
/*! this text is generated when the \\internal command is used. */
virtual QCString trForInternalUseOnly()
- { return " ."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return " , API ."; }
+ { return "Μόνο για εσωτερική χρήση."; }
/*! this text is generated when the \\warning command is used. */
virtual QCString trWarning()
- { return ""; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return " "; }
+ { return "Προειδοποίηση"; }
/*! this text is generated when the \\version command is used. */
virtual QCString trVersion()
- { return ""; }
+ { return "Έκδοση"; }
/*! this text is generated when the \\date command is used. */
virtual QCString trDate()
- { return "/"; }
+ { return "Ημ/νια"; }
/*! this text is generated when the \\return command is used. */
virtual QCString trReturns()
- { return ""; }
+ { return "Επιστρέφει"; }
/*! this text is generated when the \\sa command is used. */
virtual QCString trSeeAlso()
- { return " "; }
+ { return "Κοιτάξτε επίσης "; }
/*! this text is generated when the \\param command is used. */
virtual QCString trParameters()
- { return ""; }
+ { return "Παράμετροι"; }
/*! this text is generated when the \\exception command is used. */
virtual QCString trExceptions()
- { return ""; }
+ { return "Εξαίρεση"; }
/*! this text is used in the title page of a LaTeX document. */
virtual QCString trGeneratedBy()
- { return " "; }
+ { return "Δημιουργήθηκε από "; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990307
@@ -573,14 +551,14 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! used as the title of page containing all the index of all namespaces. */
virtual QCString trNamespaceList()
- { return " Namespace"; }
+ { return "Λίστα Namespace"; }
/*! used as an introduction to the namespace list */
virtual QCString trNamespaceListDescription(bool extractAll)
{
- QCString result=" ";
- if (!extractAll) result+=" ";
- result+="Namespace :";
+ QCString result="Ακολουθέι η λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
+ result+="Namespace με σύντομες περιγραφές:";
return result;
}
@@ -588,7 +566,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* friends of a class
*/
virtual QCString trFriends()
- { return ""; }
+ { return "Φίλοι"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
@@ -598,7 +576,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* related classes
*/
virtual QCString trRelatedFunctionDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Φιλικών και Συσχετιζόμενων Συναρτήσεων"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
@@ -610,16 +588,16 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
bool isTemplate)
{
QCString result=(QCString)clName+" ";
- result+=" ";
+ result+=" Αναφορά";
switch(compType)
{
- case ClassDef::Class: result+=" "; break;
- case ClassDef::Struct: result+=" "; break;
- case ClassDef::Union: result+=" "; break;
- case ClassDef::Interface: result+=" "; break;
- case ClassDef::Protocol: result+=" "; break;
- case ClassDef::Category: result+=" "; break;
- case ClassDef::Exception: result+=" "; break;
+ case ClassDef::Class: result+=" Κλάσης"; break;
+ case ClassDef::Struct: result+=" Δομής"; break;
+ case ClassDef::Union: result+=" Ένωσης"; break;
+ case ClassDef::Interface: result+=" Διαπροσωπίας"; break;
+ case ClassDef::Protocol: result+=" Πρωτοκόλλου"; break;
+ case ClassDef::Category: result+=" Κατηγορίας"; break;
+ case ClassDef::Exception: result+=" Εξαίρεσης"; break;
}
if (isTemplate) result+=" Template";
@@ -630,7 +608,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
virtual QCString trFileReference(const char *fileName)
{
QCString result=fileName;
- result+=" ";
+ result+=" Αναφορά Αρχείου";
return result;
}
@@ -638,30 +616,30 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
virtual QCString trNamespaceReference(const char *namespaceName)
{
QCString result=namespaceName;
- result+=" Namespace";
+ result+=" Αναφορά Namespace";
return result;
}
virtual QCString trPublicMembers()
- { return " "; }
+ { return "Δημόσιες Μέθοδοι"; }
virtual QCString trPublicSlots()
- { return " Slots"; }
+ { return "Δημόσια Slots"; }
virtual QCString trSignals()
- { return ""; }
+ { return "Σήματα"; }
virtual QCString trStaticPublicMembers()
- { return " "; }
+ { return "Στατικές Δημόσιες Μέδοδοι"; }
virtual QCString trProtectedMembers()
- { return " "; }
+ { return "Προστατευμένες Μέδοδοι"; }
virtual QCString trProtectedSlots()
- { return " Slots"; }
+ { return "Προστατευμένα Slots"; }
virtual QCString trStaticProtectedMembers()
- { return " "; }
+ { return "Στατικές Προστατευμένες Μέδοδοι"; }
virtual QCString trPrivateMembers()
- { return " "; }
+ { return "Ιδιοτικές Μέδοδοι"; }
virtual QCString trPrivateSlots()
- { return " Slots"; }
+ { return "Ιδιοτικά Slots"; }
virtual QCString trStaticPrivateMembers()
- { return " "; }
+ { return "Στατικές Ιδιοτικές Μέδοδοι"; }
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
@@ -682,7 +660,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
if (i<numEntries-2) // not the fore last entry
result+=", ";
else // the fore last entry
- result+=", ";
+ result+=", και ";
}
}
return result;
@@ -693,7 +671,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trInheritsList(int numEntries)
{
- return " "+trWriteList(numEntries)+".";
+ return "Κληρονομεί "+trWriteList(numEntries)+".";
}
/*! used in class documentation to produce a list of super classes,
@@ -701,7 +679,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trInheritedByList(int numEntries)
{
- return " "+trWriteList(numEntries)+".";
+ return "Κληρονομείται από "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
@@ -709,7 +687,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trReimplementedFromList(int numEntries)
{
- return " "+trWriteList(numEntries)+".";
+ return "Επαναϋλοποιείται από "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
@@ -717,36 +695,36 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trReimplementedInList(int numEntries)
{
- return " "+trWriteList(numEntries)+".";
+ return "Επαναϋλοποιείται στην "+trWriteList(numEntries)+".";
}
/*! This is put above each page as a link to all members of namespaces. */
virtual QCString trNamespaceMembers()
- { return " Namespace"; }
+ { return "Μέλη Namespace"; }
/*! This is an introduction to the page with all namespace members */
virtual QCString trNamespaceMemberDescription(bool extractAll)
{
- QCString result=" ";
- if (!extractAll) result+=" ";
- result+=" ";
+ QCString result="Ακολουθεί η λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
+ result+="μελών χώρων ονομάτων με συνδέσμους ";
if (extractAll)
- result+=" :";
+ result+="στην τεκμηρίωση του χώρου ονομάτων για κάθε μέλος:";
else
- result+=" :";
+ result+="στους χώρους ονομάτων που ανήκουν:";
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
- { return " "; }
+ { return "Ευρετήριο Χώρων Ονομάτων"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
virtual QCString trNamespaceDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Χώρων Ονομάτων"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990522
@@ -756,7 +734,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* namespaces in a file.
*/
virtual QCString trNamespaces()
- { return " "; }
+ { return "Χώροι Ονομάτων"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
@@ -769,19 +747,19 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
- QCString result=(QCString)" ";
+ QCString result=(QCString)"Η τεκμηρίωση για ";
switch(compType)
{
- case ClassDef::Class: result+=" "; break;
- case ClassDef::Struct: result+=" "; break;
- case ClassDef::Union: result+=" "; break;
- case ClassDef::Interface: result+=" "; break;
- case ClassDef::Protocol: result+="Protocol"; break; // translate me!
- case ClassDef::Category: result+="Category"; break; // translate me!
- case ClassDef::Exception: result+=" "; break;
+ case ClassDef::Class: result+="αυτή την κλάση"; break;
+ case ClassDef::Struct: result+="αυτή η δομή"; break;
+ case ClassDef::Union: result+="αυτή η ένωση"; break;
+ case ClassDef::Interface: result+="αυτή η διαπροσωπία"; break;
+ case ClassDef::Protocol: result+="Πρωτόκολλο"; break;
+ case ClassDef::Category: result+="Κατηγορία"; break;
+ case ClassDef::Exception: result+="αυτή η εξαίρεση"; break;
}
- result+=" ";
- if (single) result+=" :"; else result+=" :";
+ result+=" δημιουργήθηκε απο τ";
+ if (single) result+="ο ακόλουθο αρχείο:"; else result+="α ακόλουθα αρχεία:";
return result;
}
@@ -789,7 +767,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* list.
*/
virtual QCString trAlphabeticalList()
- { return " "; }
+ { return "Αλφαβητική Λίστα"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
@@ -797,34 +775,30 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
- { return " "; }
+ { return "Τιμές Επιστροφής"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
- { return " "; }
+ { return "Κύρια Σελίδα"; }
/*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
- { return "."; }
+ { return "σελ."; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991003
//////////////////////////////////////////////////////////////////////////
- virtual QCString trSources()
- {
- return "";
- }
virtual QCString trDefinedAtLineInSourceFile()
{
- return " @0 @1.";
+ return "Ορισμός στη γραμμή @0 του αρχείου @1.";
}
virtual QCString trDefinedInSourceFile()
{
- return " @0.";
+ return "Ορισμός στο αρχείο @0.";
}
//////////////////////////////////////////////////////////////////////////
@@ -833,7 +807,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
virtual QCString trDeprecated()
{
- return "";
+ return "Αποσυρμένο";
}
//////////////////////////////////////////////////////////////////////////
@@ -843,68 +817,68 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! this text is put before a collaboration diagram */
virtual QCString trCollaborationDiagram(const char *clName)
{
- return (QCString)" "+clName+":";
+ return (QCString)"Δίαγραμμα Συνεργασίας για την κλάση "+clName+":";
}
/*! this text is put before an include dependency graph */
virtual QCString trInclDepGraph(const char *fName)
{
- return (QCString)" Include "+fName+":";
+ return (QCString)"Διάγραμμα εξάρτησης Include για το αρχείο "+fName+":";
}
/*! header that is put before the list of constructor/destructors. */
virtual QCString trConstructorDocumentation()
{
- return " Constructor & Destructor";
+ return "Τεκμηρίωση Constructor & Destructor";
}
/*! Used in the file documentation to point to the corresponding sources. */
virtual QCString trGotoSourceCode()
{
- return " .";
+ return "Πήγαινε στον πηγαίο κώδικα του αρχείου.";
}
/*! Used in the file sources to point to the corresponding documentation. */
virtual QCString trGotoDocumentation()
{
- return " .";
+ return "Πήγαινε στην τεκμηρίωση του αρχείου.";
}
/*! Text for the \\pre command */
virtual QCString trPrecondition()
{
- return "";
+ return "Προϋποθέσεις";
}
/*! Text for the \\post command */
virtual QCString trPostcondition()
{
- return "";
+ return "Μεταϋποθέσεις";
}
/*! Text for the \\invariant command */
virtual QCString trInvariant()
{
- return "";
+ return "Αμετάβλητα";
}
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
{
- return " :";
+ return "Αρχική τιμή:";
}
/*! Text used the source code in the file index */
virtual QCString trCode()
{
- return "";
+ return "κώδικας";
}
virtual QCString trGraphicalHierarchy()
{
- return " ";
+ return "Γραφική Αναπαράσταση Της Ιεραρχίας Των Κλάσεων";
}
virtual QCString trGotoGraphicalHierarchy()
{
- return " ";
+ return "Πήγαινε στην γραφική αναπαράσταση της ιεραρχίας των κλάσεων";
}
virtual QCString trGotoTextualHierarchy()
{
- return " ";
+ return "Πήγαινε στην με κείμενο αναπαράσταση της ιεραρχίας των κλάσεων";
}
virtual QCString trPageIndex()
{
- return " ";
+ return "Ευρετήριο Σελίδων";
}
//////////////////////////////////////////////////////////////////////////
@@ -913,50 +887,50 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
virtual QCString trNote()
{
- return "";
+ return "Σημείωση";
}
virtual QCString trPublicTypes()
{
- return " ";
+ return "Δημόσιοι Τυποι";
}
virtual QCString trPublicAttribs()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Πεδία Δεδομένων";
}
else
{
- return " ";
+ return "Δημόσια Χαρακτηριστικά";
}
}
virtual QCString trStaticPublicAttribs()
{
- return " ";
+ return "Στατικά Δημόσια Χαρακτηριστικά";
}
virtual QCString trProtectedTypes()
{
- return " ";
+ return "Προστατευμένοι Τύποι";
}
virtual QCString trProtectedAttribs()
{
- return " ";
+ return "Προστατευμένα Χαρακτηριστικά";
}
virtual QCString trStaticProtectedAttribs()
{
- return " ";
+ return "Στατικά Προστατευμένα Χαρακτηριστικά";
}
virtual QCString trPrivateTypes()
{
- return " ";
+ return "Ιδιωτικοί Τύποι";
}
virtual QCString trPrivateAttribs()
{
- return " ";
+ return "Ιδιωτικα Χαρακτηριστικά";
}
virtual QCString trStaticPrivateAttribs()
{
- return " ";
+ return "Στατικά Ιδιωτικα Χαρακτηριστικά";
}
//////////////////////////////////////////////////////////////////////////
@@ -966,12 +940,12 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! Used as a marker that is put before a \\todo item */
virtual QCString trTodo()
{
- return " ";
+ return "Προς Υλοποίηση";
}
/*! Used as the header of the todo list */
virtual QCString trTodoList()
{
- return " ";
+ return "Λίστα των Προς Υλοποίηση";
}
//////////////////////////////////////////////////////////////////////////
@@ -980,24 +954,24 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
virtual QCString trReferencedBy()
{
- return " ";
+ return "Αναφορά από";
}
virtual QCString trRemarks()
{
- return "";
+ return "Παρατήρηση";
}
virtual QCString trAttention()
{
- return "";
+ return "Προσοχή";
}
virtual QCString trInclByDepGraph()
{
- return " "
- " :";
+ return "Το γράφημα αυτό παρουσιάζει ποιά αρχεία άμεσα ή "
+ "έμεσα περιλαμβάνουν αυτό το αρχείο:";
}
virtual QCString trSince()
{
- return "";
+ return "Από";
}
//////////////////////////////////////////////////////////////////////////
@@ -1007,7 +981,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! title of the graph legend page */
virtual QCString trLegendTitle()
{
- return " ";
+ return "Υπόμνημα Διαγραμμάτων";
}
/*! page explaining how the dot graph's should be interpreted
* The %A in the text below are to prevent link to classes called "A".
@@ -1015,9 +989,9 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
virtual QCString trLegendDocs()
{
return
- " "
- " doxygen.<p>\n"
- " :"
+ "Αυτή η σελίδα εξηγεί το πως ερμηνεύονται τα διαγράμματα που δημιουργούνται "
+ "από το doxygen.<p>\n"
+ "Θεωρείστε το παρακάτω παράδειγμα:"
"\\code\n"
"/*! Invisible class because of truncation */\n"
"class Invisible { };\n\n"
@@ -1046,35 +1020,40 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
- " \\c MAX_DOT_GRAPH_HEIGHT "
- " 200 :"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "Αυτό οδηγεί στο επόμενο γράφημα:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
"<p>\n"
- " :\n"
+ "Τα κουτιά στο παραπάνω διάγραμμα έχουν την ακόλουθη σημασία:\n"
+ "</p>\n"
"<ul>\n"
- "<li> "
- " .\n"
- "<li> .\n"
- "<li> .\n"
- "<li> "
- " . % "
- " ."
+ "<li>Ένα γεμισμένο μαύρο κουτί αναπαριστά τη δομή ή την κλάση για την οποία"
+ "αφορά το διάγραμμα.\n"
+ "<li>Ένα κουτί με μαύρο περίγραμμα αναπαριστά μία τεκμηριωμένη δομή ή κλάση.\n"
+ "<li>Ένα κουτί με γκρίζο περίγραμμα αναπαριστά μία μη τεκμηριωμένη δομή ή κλάση.\n"
+ "<li>Ένα κουτί με κόκκινο περίγραμμα αναπαριστά μία τεκμηριωμένη δομή ή κλάση για "
+ "την οποία δεν παρουσιάζονται όλες οι σχέσεις κληρονομικότητας και περιεχομένου. %Ένα "
+ "διάγραμμα μειώνεται αν δεν χωράει στις ορισμένες διαστάσεις."
"</ul>\n"
- " :\n"
+ "<p>\n"
+ "Τα βέλη έχουν τις ακόλουθες σημασίες:\n"
+ "</p>\n"
"<ul>\n"
- "<li> "
- " .\n"
- "<li> .\n"
- "<li> .\n"
- "<li> "
- " . () "
- " . \n"
+ "<li>Ένα βαθύ μπλε βέλος χρησιμοποιείται για να παρουσιάσει μία δημόσια σχέση κληρονομικότητας "
+ "μεταξύ δύο κλάσεων.</li>\n"
+ "<li>Ένα βαθύ πράσινο βέλος χρησιμοποιείται για προστατευμένη κληρονομικότητα.</li>\n"
+ "<li>Ένα βαθύ κόκκινο βέλος χρησιμοποιείται για ιδιωτική κληρονομικότητα.</li>\n"
+ "<li>Ένα μωβ διακεκομένο βέλος χρησιμοποιείται αν μία κλάση περιέχεται ή χρησιμοποιείται "
+ "από μία άλλη κλάση. Το βέλος ονομάζεται από το όνομα της μεταβλητής(ων) "
+ "μέσω της οποίας η κλάση ή δομή είναι προσβάσιμη.</li>\n"
+ "<li>Ένα κίτρινο διακεκομμένο βέλος χρησιμοποιείται για μια σχέση μεταξύ ενός template αντικειμένου και "
+ "της template κλάσης από την οποία δημιουργήθηκε. Το βέλος ονομάζεται με τις παραμέτρους του template "
+ "του αντικειμένου.</li>\n"
"</ul>\n";
}
/*! text for the link to the legend page */
virtual QCString trLegend()
{
- return "";
+ return "υπόμνημα";
}
//////////////////////////////////////////////////////////////////////////
@@ -1084,12 +1063,12 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! Used as a marker that is put before a test item */
virtual QCString trTest()
{
- return "";
+ return "Δοκιμαστικό";
}
/*! Used as the header of the test list */
virtual QCString trTestList()
{
- return " ";
+ return "Λίστα Δοκιμαστικών";
}
//////////////////////////////////////////////////////////////////////////
@@ -1099,7 +1078,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! Used as a section header for KDE-2 IDL methods */
virtual QCString trDCOPMethods()
{
- return " DCOP";
+ return "Μέδοδοι DCOP";
}
//////////////////////////////////////////////////////////////////////////
@@ -1109,64 +1088,54 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! Used as a section header for IDL properties */
virtual QCString trProperties()
{
- return "";
+ return "Ιδιότητες";
}
/*! Used as a section header for IDL property documentation */
virtual QCString trPropertyDocumentation()
{
- return " ";
+ return "Τεκμηρίωση Ιδιοτήτων";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.4
//////////////////////////////////////////////////////////////////////////
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "";
- }
/*! Used for Java classes in the summary section of Java packages */
virtual QCString trClasses()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return " ";
+ return "Δομές Δεδομένων";
}
else
{
- return "";
+ return "Κλάσεις";
}
}
/*! Used as the title of a Java package */
virtual QCString trPackage(const char *name)
{
- return (QCString)" "+name;
+ return (QCString)"Πακέτο "+name;
}
/*! Title of the package index page */
virtual QCString trPackageList()
{
- return " ";
+ return "Λίστα Πακέτων";
}
/*! The description of the package index page */
virtual QCString trPackageListDescription()
{
- return " ( ):";
+ return "Ακολουθεί η λίστα των πακέτων με σύντομη περιγραφή (αν υπάρχει):";
}
/*! The link name in the Quick links header for each page */
virtual QCString trPackages()
{
- return "";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return " ";
+ return "Πακέτα";
}
/*! Text shown before a multi-line define */
virtual QCString trDefineValue()
{
- return ":";
+ return "Τιμή:";
}
//////////////////////////////////////////////////////////////////////////
@@ -1176,12 +1145,12 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! Used as a marker that is put before a \\bug item */
virtual QCString trBug()
{
- return "";
+ return "Πρόβλημα";
}
/*! Used as the header of the bug list */
virtual QCString trBugList()
{
- return " ";
+ return "Λίστα Προβλημάτων";
}
//////////////////////////////////////////////////////////////////////////
@@ -1230,7 +1199,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! Used as header RTF general index */
virtual QCString trRTFGeneralIndex()
{
- return "";
+ return "Ευρετήριο";
}
/*! This is used for translation of the word that will possibly
@@ -1239,7 +1208,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trClass(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
+ QCString result((first_capital ? "Κλάση" : "κλάση"));
if (!singular) result+="";
return result;
}
@@ -1250,8 +1219,8 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trFile(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
- if (!singular) result+=""; else result+="";
+ QCString result((first_capital ? "Αρχεί" : "αρχεί"));
+ if (!singular) result+="α"; else result+="ο";
return result;
}
@@ -1272,8 +1241,8 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trGroup(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
- if (!singular) result+=""; else result+="";
+ QCString result((first_capital ? "Ομάδ" : "ομάδ"));
+ if (!singular) result+="ες"; else result+="α";
return result;
}
@@ -1283,8 +1252,8 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trPage(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
- if (!singular) result+=""; else result+="";
+ QCString result((first_capital ? "Σελίδ" : "σελίδ"));
+ if (!singular) result+="ες"; else result+="α";
return result;
}
@@ -1294,19 +1263,8 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trMember(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
- if (!singular) result+=""; else result+="";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "" : ""));
- if (!singular) result+=""; else result+="";
+ QCString result((first_capital ? "Μέλ" : "μέλ"));
+ if (!singular) result+="η"; else result+="ος";
return result;
}
@@ -1316,8 +1274,8 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trGlobal(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
- if (!singular) result+=""; else result+="";
+ QCString result((first_capital ? "Καθολικ" : "καθολικ"));
+ if (!singular) result+="ές"; else result+="ή";
return result;
}
@@ -1329,8 +1287,8 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* for the author section in man pages. */
virtual QCString trAuthor(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
- if (!singular) result+=""; else result+="";
+ QCString result((first_capital ? "Συγραφ" : "συγραφ"));
+ if (!singular) result+=""; else result+="έας";
return result;
}
@@ -1342,7 +1300,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trReferences()
{
- return "";
+ return "Αναφορές";
}
//////////////////////////////////////////////////////////////////////////
@@ -1354,7 +1312,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trImplementedFromList(int numEntries)
{
- return " "+trWriteList(numEntries)+".";
+ return "Υλοποιεί "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
@@ -1362,7 +1320,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trImplementedInList(int numEntries)
{
- return " "+trWriteList(numEntries)+".";
+ return "Υλοποιείται από "+trWriteList(numEntries)+".";
}
//////////////////////////////////////////////////////////////////////////
@@ -1374,7 +1332,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trRTFTableOfContents()
{
- return " ";
+ return "Πίνακας Περιεχομένων";
}
//////////////////////////////////////////////////////////////////////////
@@ -1386,7 +1344,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trDeprecatedList()
{
- return " ";
+ return "Λίστα Καταργημένων";
}
//////////////////////////////////////////////////////////////////////////
@@ -1398,12 +1356,12 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trEvents()
{
- return "";
+ return "Συμβάντα";
}
/*! Header used for the documentation section of a class' events. */
virtual QCString trEventDocumentation()
{
- return " ";
+ return "Τεκμηρίωση Συμβάντων";
}
//////////////////////////////////////////////////////////////////////////
@@ -1414,35 +1372,35 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trPackageTypes()
{
- return " ";
+ return "Τύποι Πακέτων";
}
/*! Used as a heading for a list of Java class functions with package
* scope.
*/
virtual QCString trPackageMembers()
{
- return " ";
+ return "Συναρτήσεις Πακέτου";
}
/*! Used as a heading for a list of static Java class functions with
* package scope.
*/
virtual QCString trStaticPackageMembers()
{
- return " ";
+ return "Στατικές Συναρτήσεις Πακέτου";
}
/*! Used as a heading for a list of Java class variables with package
* scope.
*/
virtual QCString trPackageAttribs()
{
- return " ";
+ return "Μεταβλητές Πακέτου";
}
/*! Used as a heading for a list of static Java class variables with
* package scope.
*/
virtual QCString trStaticPackageAttribs()
{
- return " ";
+ return "Στατικές Μεταβλητές Πακέτου";
}
//////////////////////////////////////////////////////////////////////////
@@ -1454,12 +1412,12 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trAll()
{
- return "";
+ return "Όλα";
}
/*! Put in front of the call graph for a function. */
virtual QCString trCallGraph()
{
- return " :";
+ return "Το γράφημα δείχνει ποιές συναρτήσεις καλούνται από αυτή:";
}
//////////////////////////////////////////////////////////////////////////
@@ -1472,14 +1430,14 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trSearchForIndex()
{
- return " ";
+ return "Αναζήτηση για";
}
/*! This string is used as the title for the page listing the search
* results.
*/
virtual QCString trSearchResultsTitle()
{
- return " ";
+ return "Αποτελέσματα Αναζήτησης";
}
/*! This string is put just before listing the search results. The
* text can be different depending on the number of documents found.
@@ -1493,16 +1451,16 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
{
if (numDocuments==0)
{
- return ", .";
+ return "Συγγνώμη, δεν υπάρχει κείμενο που να ταιριάζει με την αίτησή σας.";
}
else if (numDocuments==1)
{
- return " <b>1</b> .";
+ return "Βρέθηκε <b>1</b> κείμενο που ταιριάζει με την αίτησή σας.";
}
else
{
- return " <b>$num</b> . "
- " .";
+ return "Βρέθηκαν <b>$num</b> κείμενα που ταιριάζουν με την αίτησή σας. "
+ "Πρώτα εμφανίζονται τα κείμενα που ταιριάζουν πιο πολύ.";
}
}
/*! This string is put before the list of matched words, for each search
@@ -1510,7 +1468,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trSearchMatches()
{
- return ":";
+ return "Ταίριαξαν:";
}
//////////////////////////////////////////////////////////////////////////
@@ -1521,7 +1479,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trSourceFile(QCString& filename)
{
- return " " + filename;
+ return "Αρχείο κώδικα " + filename;
}
//////////////////////////////////////////////////////////////////////////
@@ -1532,41 +1490,41 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
* hierarchy.
*/
virtual QCString trDirIndex()
- { return " "; }
+ { return "Ιεραρχία Καταλόγου"; }
/*! This is used as the name of the chapter containing the documentation
* of the directories.
*/
virtual QCString trDirDocumentation()
- { return " "; }
+ { return "Τεκμηρίωση Καταλόγου"; }
/*! This is used as the title of the directory index and also in the
* Quick links of an HTML page, to link to the directory hierarchy.
*/
virtual QCString trDirectories()
- { return ""; }
+ { return "Κατάλογοι"; }
/*! This returns a sentences that introduces the directory hierarchy.
* and the fact that it is sorted alphabetically per level
*/
virtual QCString trDirDescription()
{
- return " , :";
+ return "Η ιεραρχία καταλόγων ταξινομήθηκε αλφαβητικά, αλλά όχι πολύ αυστηρά:";
}
/*! This returns the title of a directory page. The name of the
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const char *dirName)
- { QCString result=QCString(" ") + dirName; return result; }
+ { QCString result=QCString("Αναφορά του Καταλόγου ") + dirName; return result; }
/*! This returns the word directory with or without starting capital
* (\a first_capital) and in sigular or plural form (\a singular).
*/
virtual QCString trDir(bool first_capital, bool singular)
{
- QCString result((first_capital ? "" : ""));
- if (singular) result+=""; else result+="";
+ QCString result((first_capital ? "Κατάλογο" : "κατάλογο"));
+ if (singular) result+="ς"; else result+="ι";
return result;
}
@@ -1579,9 +1537,9 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
*/
virtual QCString trOverloadText()
{
- return " -, "
- " . "
- " .";
+ return "Αυτή είναι μια υπερφορτωμένη συνάρτηση-μέλος, "
+ "που παρέχεται για ευκολία. Διαφέρει από την παραπάνω "
+ "συνάρτηση μόνο στον τύπο των παραμέτρων που δέχεται.";
}
//////////////////////////////////////////////////////////////////////////
@@ -1591,7 +1549,7 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
/*! This is used to introduce a caller (or called-by) graph */
virtual QCString trCallerGraph()
{
- return " :";
+ return "Το γράφημα δείχνει από ποιές συναρτήσεις καλείται αυτή η συνάρτηση:";
}
/*! This is used in the documentation of a file/namespace before the list
@@ -1600,6 +1558,294 @@ class TranslatorGreek : public TranslatorAdapter_1_5_4
virtual QCString trEnumerationValueDocumentation()
{ return "Enumerator Documentation"; }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Τεκμηρίωση Συνάρτησης/Υπορουτίνας Μέλους"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Λίστα Τύπων Δεδομένων"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Πεδία Δεδομένων"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Εδώ είναι οι τύποι δεδομένων με σύντομη περιγραφή:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Εδώ είναι η λίστα όλων των ";
+ if (!extractAll)
+ {
+ result+="τεκμηριωμένων ";
+ }
+ result+="μελών τύπων δεδομένων";
+ result+=" με συνδέσεις ";
+ if (!extractAll)
+ {
+ result+="στην τεκμηρίωση της δομής δεδομένων για κάθε μέλος";
+ }
+ else
+ {
+ result+="στους τύπους δεδομένων που ανήκουν:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Περιεχόμενα Τύπων Δεδομένων"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Τεκμηρίωση Τύπων Δεδομένων"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Συναρτήσεις/Υπορουτίνες"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Τεκμηρίωση Συνάρτησης/Υπορουτίνας"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Τύποι Δεδομένων"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Λίστα Υπομονάδων"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Εδώ είναι μια λίστα με όλες τις ";
+ if (!extractAll) result+="τεκμηριωμένες ";
+ result+="υπομονάδες με σύντομή περιγραφή:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Υπομονάδα"; break;
+ case ClassDef::Struct: result+=" Τύπος"; break;
+ case ClassDef::Union: result+=" Ένωση"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Πρωτόκολλο"; break;
+ case ClassDef::Category: result+=" Κατηγορία"; break;
+ case ClassDef::Exception: result+=" Εξαίρεση"; break;
+ }
+ if (isTemplate) result+=" Πρότυπο";
+ result+=" Δήλωση";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Δηλώσεις Υπομονάδων";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Υπομονάδες Μέλη"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Εδώ είναι μια λίστα με όλες τις ";
+ if (!extractAll) result+="τεκμηριωμένες ";
+ result+="μέλη υπομονάδες με συνδέσεις ";
+ if (extractAll)
+ {
+ result+="στην τεκμηρίωση της υπομονάδας για κάθε μέλος:";
+ }
+ else
+ {
+ result+="στις υπομονάδες που ανήκουν:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Περιεχόμενα Υπομονάδων"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Υπομονάδ" : "υπομονάδ"));
+ if (!singular) result+="ες"; else result+="α";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Η τεκμηρίωση για ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="αυτή την υπομονάδα"; break;
+ case ClassDef::Struct: result+="αυτό τον τύπο δεδομένων"; break;
+ case ClassDef::Union: result+="αυτή την ένωση"; break;
+ case ClassDef::Interface: result+="αυτό το interface"; break;
+ case ClassDef::Protocol: result+="αυτό το πρωτόκολλο"; break;
+ case ClassDef::Category: result+="αυτή την κατηγορία"; break;
+ case ClassDef::Exception: result+="αυτή την εξαίρεση"; break;
+ }
+ result+=" δημιουργήθηκε από ";
+ if (single) result+="το παρακάτω αρχείο:"; else result+="τα παρακάτω αρχεία:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Τύπο" : "τύπο"));
+ if (!singular) result+="ι"; else result+="ος";
+ result+= first_capital ? " Δεδομένων" : " δεδομένων";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Υποπρ" : "υποπρ"));
+ if (!singular) result+="ογράμματα"; else result+="όγραμμα";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Περιορισμοί Τύπων Δεδομένων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Σχέση του "+QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Φόρτωση...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Γενικός χώρος ονομάτων";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Αναζήτηση...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Δεν βρέθηκαν αποτελέσματα αναζήτησης";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Γράφημα εξάρτησης φακέλου για το "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Αρχείο σε "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Εσωκλείει το αρχείο στο "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ","Κυρ" };
+ static const char *months[] = { "Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ" };
+ QCString sdate;
+ sdate.sprintf("%s %.2d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
};
+
#endif
diff --git a/src/translator_hr.h b/src/translator_hr.h
index aeca4d1..eeba2c8 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -75,10 +75,13 @@
// - Updates for "new since 1.6.0 (mainly for the new search engine)".
// - UTF-8
// - removed decode()
+//
+// 2010/05/27
+// - Updates for 1.6.3
#ifndef TRANSLATOR_HR_H
#define TRANSLATOR_HR_H
-class TranslatorCroatian : public TranslatorAdapter_1_6_3
+class TranslatorCroatian : public Translator
{
private:
@@ -1491,6 +1494,62 @@ class TranslatorCroatian : public TranslatorAdapter_1_6_3
{
return "Nema traženih podataka";
}
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Graf povezanih direktorija za "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Datoteka u "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Uključuje datotake u "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Pon","Uto","Sri","Čet","Pet","Sub","Ned" };
+ static const char *months[] = { "Sje","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
};
#endif
diff --git a/src/util.cpp b/src/util.cpp
index 86e825e..2a288e4 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -463,7 +463,7 @@ NamespaceDef *getResolvedNamespace(const char *name)
}
if (count==10)
{
- warn_cont("Warning: possible recursive namespace alias detected for %s!\n",name);
+ err("Warning: possible recursive namespace alias detected for %s!\n",name);
}
return Doxygen::namespaceSDict->find(subst->data());
}
@@ -6996,5 +6996,35 @@ void writeSummaryLink(OutputList &ol,const char *label,const char *title,
ol.writeString("</a>");
}
+QCString externalLinkTarget()
+{
+ static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW");
+ if (extLinksInWindow) return "target=\"_blank\" "; else return "";
+}
+QCString externalRef(const QCString &relPath,const QCString &ref,bool href)
+{
+ QCString result;
+ if (!ref.isEmpty())
+ {
+ QCString *dest = Doxygen::tagDestinationDict[ref];
+ if (dest)
+ {
+ result = *dest;
+ int l = result.length();
+ if (!relPath.isEmpty() && l>0 && result.at(0)=='.')
+ { // relative path -> prepend relPath.
+ result.prepend(relPath);
+ }
+ if (!href) result.prepend("doxygen=\""+ref+":");
+ if (l>0 && !result.at(l-1)!='/') result+='/';
+ if (!href) result.append("\" ");
+ }
+ }
+ else
+ {
+ result = relPath;
+ }
+ return result;
+}
diff --git a/src/util.h b/src/util.h
index 8aa8ef5..1a8ee50 100644
--- a/src/util.h
+++ b/src/util.h
@@ -377,5 +377,8 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList);
void writeSummaryLink(OutputList &ol,const char *label,const char *title,
bool &first);
+QCString externalLinkTarget();
+QCString externalRef(const QCString &relPath,const QCString &ref,bool href);
+
#endif