Commit b6550378 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.7.4-20110629

parent de297f6d
DOXYGEN Version 1.7.4-20110606
DOXYGEN Version 1.7.4-20110629
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (06 June 2011)
Dimitri van Heesch (29 June 2011)
DOXYGEN Version 1.7.4_20110606
DOXYGEN Version 1.7.4_20110629
Please read INSTALL for compilation instructions.
......@@ -26,4 +26,4 @@ forum.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (06 June 2011)
Dimitri van Heesch (dimitri@stack.nl) (29 June 2011)
......@@ -20,7 +20,7 @@ doxygen_version_minor=7
doxygen_version_revision=4
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20110606
doxygen_version_mmn=20110629
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......
......@@ -2282,14 +2282,13 @@ install and use dot, since it yields more powerful graphs.
\anchor cfg_dot_fontname
<dt>\c DOT_FONTNAME <dd>
\addindex DOT_FONTNAME
By default doxygen will write a font called \c FreeSans.ttf to the output
directory and reference it in all dot files that doxygen generates. This
font does not include all possible unicode characters however, so when you need
these (or just want a differently looking font) you can specify the font name
using \c DOT_FONTNAME. You 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
\c DOTFONTPATH environment variable or by setting \c DOT_FONTPATH to the directory
containing the font.
By default doxygen will use the Helvetica font for all dot files that
doxygen generates.
When you want a differently looking font you can specify the font name
using \c DOT_FONTNAME. You 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
\c DOTFONTPATH environment variable or by setting \c DOT_FONTPATH to the
directory containing the font.
\anchor cfg_dot_fontsize
<dt>\c DOT_FONTSIZE <dd>
......@@ -2422,13 +2421,18 @@ The default size is 10pt.
The \c DOT_IMAGE_FORMAT tag can be used to set the image format of the images
generated by dot. Possible values are svg, png, jpg, or gif.
If left blank png will be used.
\note If you choose \c svg you need to set
HTML_FILE_EXTENSION to xhtml in order to make the SVG files
visible in IE 9+ (other browsers do not have this requirement).
\anchor cfg_interactive_svg
<dt>\c INTERACTIVE_SVG
If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
enable generation of interactive SVG images that allow zooming and panning.
Note that this requires a modern browser. For Internet Explorer you will need
at least version 9.
Note that this requires a modern browser other than Internet Explorer.
Tested and working are Firefox, Chrome, Safari, and Opera.
\note For IE 9+ you need to set \c HTML_FILE_EXTENSION to xhtml in order
to make the SVG files visible. Older versions of IE do not have SVG support.
\anchor cfg_dot_path
<dt>\c DOT_PATH <dd>
......
......@@ -204,7 +204,7 @@ In this case the \c Makefile will only contain a target to build
\addindex RTF
Doxygen combines the RTF output to a single file called refman.rtf. This
file is optimized for importing into the Microsoft Word. Certain information
is encoded using field. To show the actual value you need to
is encoded using so called fields. To show the actual value you need to
select all (Edit - select all) and then toggle fields (right click and select
the option from the drop down menu).
......
# Doxyfile 1.7.2
# Doxyfile 1.7.4
#---------------------------------------------------------------------------
# Project related configuration options
......@@ -6,6 +6,8 @@
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = Qtools
PROJECT_NUMBER =
PROJECT_BRIEF =
PROJECT_LOGO =
OUTPUT_DIRECTORY = ../qtools_docs
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
......@@ -36,6 +38,7 @@ SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
TYPEDEF_HIDES_STRUCT = NO
SYMBOL_CACHE_SIZE = 0
#---------------------------------------------------------------------------
......@@ -128,16 +131,17 @@ IGNORE_PREFIX = Q
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT =
HTML_FILE_EXTENSION = .html
HTML_FILE_EXTENSION = .xhtml
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = YES
HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO
HTML_DYNAMIC_SECTIONS = YES
GENERATE_DOCSET = YES
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_BUNDLE_ID = org.doxygen.Project
......@@ -171,7 +175,7 @@ FORMULA_TRANSPARENT = YES
USE_MATHJAX = NO
MATHJAX_RELPATH = http://www.mathjax.org/mathjax
SEARCHENGINE = YES
SERVER_BASED_SEARCH = YES
SERVER_BASED_SEARCH = NO
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
......@@ -183,6 +187,7 @@ COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
LATEX_FOOTER =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
......@@ -249,9 +254,9 @@ PERL_PATH = /usr/bin/perl
CLASS_DIAGRAMS = NO
MSCGEN_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
HAVE_DOT = YES
DOT_NUM_THREADS = 0
DOT_FONTNAME = FreeSans.ttf
DOT_FONTNAME =
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
......@@ -265,7 +270,8 @@ CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_IMAGE_FORMAT = svg
INTERACTIVE_SVG = YES
DOT_PATH =
DOTFILE_DIRS =
MSCFILE_DIRS =
......
......@@ -64,6 +64,8 @@ static QCString g_blockName;
static int g_lastCommentContext;
static bool g_inSpecialComment;
static bool g_inRoseComment;
static int g_stringContext;
static int g_charContext;
static int g_javaBlock;
static bool g_specialComment;
......@@ -310,10 +312,12 @@ void replaceComment(int offset);
}
<Scan>"\"" { /* start of a string */
copyToOutput(yytext,yyleng);
g_stringContext = YY_START;
BEGIN(SkipString);
}
<Scan>' {
copyToOutput(yytext,yyleng);
g_charContext = YY_START;
BEGIN(SkipChar);
}
<Scan>\n { /* new line */
......@@ -506,7 +510,7 @@ void replaceComment(int offset);
}
<SkipString>"\"" { /* end of string */
copyToOutput(yytext,yyleng);
BEGIN(Scan);
BEGIN(g_stringContext);
}
<SkipString>. { /* any other string character */
copyToOutput(yytext,yyleng);
......@@ -519,7 +523,7 @@ void replaceComment(int offset);
}
<SkipChar>' { /* end of character literal */
copyToOutput(yytext,yyleng);
BEGIN(Scan);
BEGIN(g_charContext);
}
<SkipChar>. { /* any other string character */
copyToOutput(yytext,yyleng);
......@@ -528,10 +532,10 @@ void replaceComment(int offset);
copyToOutput(yytext,yyleng);
}
<CComment>[^\\!@*\n{]* { /* anything that is not a '*' or command */
<CComment>[^\\!@*\n{\"]* { /* anything that is not a '*' or command */
copyToOutput(yytext,yyleng);
}
<CComment>"*"+[^*/\\@\n]* { /* stars without slashes */
<CComment>"*"+[^*/\\@\n{\"]* { /* stars without slashes */
copyToOutput(yytext,yyleng);
}
<CComment>"\"\"\"" { /* end of Python docstring */
......@@ -593,6 +597,16 @@ void replaceComment(int offset);
BEGIN(Scan);
}
}
<CComment>"'" {
g_charContext = YY_START;
copyToOutput(yytext,yyleng);
BEGIN(SkipChar);
}
<CComment>"\"" {
g_stringContext = YY_START;
copyToOutput(yytext,yyleng);
BEGIN(SkipString);
}
<CComment>. {
copyToOutput(yytext,yyleng);
}
......@@ -734,6 +748,18 @@ void replaceComment(int offset);
}
<ReadAliasArgs>^[ \t]*"//"[/!]/[^\n]+ { // skip leading special comments (see bug 618079)
}
<ReadAliasArgs>"*/" { // oops, end of comment in the middle of an alias?
if (g_lang==SrcLangExt_Python)
{
REJECT;
}
else // abort the alias, restart scanning
{
copyToOutput(g_aliasString,g_aliasString.length());
copyToOutput(yytext,yyleng);
BEGIN(Scan);
}
}
<ReadAliasArgs>[^{}\n\\\*]+ {
g_aliasString+=yytext;
g_lastEscaped=FALSE;
......
......@@ -1405,23 +1405,21 @@ 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 Helvetica to the output
directory and reference it in all dot files that doxygen generates.
When you want a differently looking font you can specify the font name
using DOT_FONTNAME. You 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.
By default doxygen will use the Helvetica font for all dot files that
doxygen generates. When you want a differently looking font you can specify
the font name using DOT_FONTNAME. You 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='Helvetica' 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.
' minval='4' maxval='24' defval='10' depends='HAVE_DOT'/>
<option type='string' id='DOT_FONTPATH' format='string' docs='
By default doxygen will tell dot to use the output directory to look for the
FreeSans.ttf font (which doxygen will put there itself). If you specify a
different font using DOT_FONTNAME you can set the path where dot
can find it using this tag.
By default doxygen will tell dot to use the Helvetica font.
If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
set the path where dot can find it.
' defval='' depends='HAVE_DOT'/>
<option type='bool' id='CLASS_GRAPH' docs='
If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
......@@ -1487,7 +1485,9 @@ relations between the files in the directories.
<option type='enum' id='DOT_IMAGE_FORMAT' defval='png' docs='
The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
generated by dot. Possible values are svg, png, jpg, or gif.
If left blank png will be used.
If left blank png will be used. If you choose svg you need to set
HTML_FILE_EXTENSION to xhtml in order to make the SVG files
visible in IE 9+ (other browsers do not have this requirement).
' depends='HAVE_DOT'>
<value name='png'/>
<value name='jpg'/>
......@@ -1497,8 +1497,10 @@ If left blank png will be used.
<option type='bool' id='INTERACTIVE_SVG' doc='
If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
enable generation of interactive SVG images that allow zooming and panning.
Note that this requires a modern browser. For Internet Explorer you will need
at least version 9.
Note that this requires a modern browser other than Internet Explorer.
Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
visible. Older versions of IE do not have SVG support.
' defval='0' depends='HAVE_DOT'/>
<option type='string' id='DOT_PATH' format='dir' docs='
The tag DOT_PATH can be used to specify the path where the dot tool can be
......
......@@ -2123,13 +2123,11 @@ void addConfigOptions(Config *cfg)
//----
cs = cfg->addString(
"DOT_FONTNAME",
"By default doxygen will write a font called Helvetica to the output\n"
"directory and reference it in all dot files that doxygen generates.\n"
"When you want a differently looking font you can specify the font name\n"
"using DOT_FONTNAME. You need to make sure dot is able to find the font,\n"
"which can be done by putting it in a standard location or by setting the\n"
"DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory\n"
"containing the font."
"By default doxygen will use the Helvetica font for all dot files that doxygen generates. When you want a differently looking font you can specify\n"
"the font name using DOT_FONTNAME. You need to make sure dot is able to find\n"
"the font, which can be done by putting it in a standard location or by setting\n"
"the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n"
"directory containing the font."
);
cs->setDefaultValue("Helvetica");
cs->addDependency("HAVE_DOT");
......@@ -2144,10 +2142,8 @@ void addConfigOptions(Config *cfg)
//----
cs = cfg->addString(
"DOT_FONTPATH",
"By default doxygen will tell dot to use the output directory to look for the\n"
"FreeSans.ttf font (which doxygen will put there itself). If you specify a\n"
"different font using DOT_FONTNAME you can set the path where dot\n"
"can find it using this tag."
"By default doxygen will tell dot to use the Helvetica font.\n"
"If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to set the path where dot can find it."
);
cs->addDependency("HAVE_DOT");
//----
......@@ -2260,7 +2256,8 @@ void addConfigOptions(Config *cfg)
"DOT_IMAGE_FORMAT",
"The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n"
"generated by dot. Possible values are svg, png, jpg, or gif.\n"
"If left blank png will be used.",
"If left blank png will be used. If you choose svg you need to set\n"
"HTML_FILE_EXTENSION to xhtml in order to make the SVG files visible in IE 9+ (other browsers do not have this requirement).",
"png"
);
ce->addValue("png");
......
This diff is collapsed.
......@@ -166,7 +166,7 @@ class DotClassGraph
bool isTooBig() const;
QCString writeGraph(FTextStream &t,GraphOutputFormat f,const char *path,
const char *fileName, const char *relPath,
bool TBRank=TRUE,bool imageMap=TRUE) const;
bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1) const;
void writeXML(FTextStream &t);
void writeDEF(FTextStream &t);
......@@ -196,7 +196,7 @@ class DotInclDepGraph
~DotInclDepGraph();
QCString writeGraph(FTextStream &t, GraphOutputFormat f,
const char *path,const char *fileName,const char *relPath,
bool writeImageMap=TRUE) const;
bool writeImageMap=TRUE,int graphId=-1) const;
bool isTrivial() const;
bool isTooBig() const;
QCString diskName() const;
......@@ -223,7 +223,8 @@ class DotCallGraph
~DotCallGraph();
QCString writeGraph(FTextStream &t, GraphOutputFormat f,
const char *path,const char *fileName,
const char *relPath,bool writeImageMap=TRUE) const;
const char *relPath,bool writeImageMap=TRUE,
int graphId=-1) const;
void buildGraph(DotNode *n,MemberDef *md,int distance);
bool isTrivial() const;
bool isTooBig() const;
......@@ -253,7 +254,8 @@ class DotDirDeps
const char *path,
const char *fileName,
const char *relPath,
bool writeImageMap=TRUE) const;
bool writeImageMap=TRUE,
int graphId=-1) const;
private:
DirDef *m_dir;
};
......@@ -299,7 +301,7 @@ class DotGroupCollaboration
~DotGroupCollaboration();
QCString writeGraph(FTextStream &t, GraphOutputFormat format,
const char *path,const char *fileName,const char *relPath,
bool writeImageMap=TRUE) const;
bool writeImageMap=TRUE,int graphId=-1) const;
void buildGraph(GroupDef* gd);
bool isTrivial() const;
private :
......@@ -368,13 +370,15 @@ class DotFilePatcher
QCString context;
QCString label;
bool zoomable;
int graphId;
};
DotFilePatcher(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);
int addSVGConversion(const QCString &relPath,bool urlOnly,const QCString &context,bool zoomable);
int addSVGConversion(const QCString &relPath,bool urlOnly,
const QCString &context,bool zoomable,int graphId);
int addSVGObject(const QCString &baseName, const QCString &figureName,
const QCString &relPath);
bool run();
......@@ -421,7 +425,7 @@ class DotManager
int addFigure(const QCString &file,const QCString &baseName,
const QCString &figureName,bool heightCheck);
int addSVGConversion(const QCString &file,const QCString &relPath,
bool urlOnly,const QCString &context,bool zoomable);
bool urlOnly,const QCString &context,bool zoomable,int graphId);
int addSVGObject(const QCString &file,const QCString &baseName,
const QCString &figureNAme,const QCString &relPath);
bool run();
......@@ -445,7 +449,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
void writeDotImageMapFromFile(FTextStream &t,
const QCString& inFile, const QCString& outDir,
const QCString& relPath,const QCString& baseName,
const QCString& context);
const QCString& context,int graphId=-1);
void writeDotDirDepGraph(FTextStream &t,DirDef *dd);
......
......@@ -9261,6 +9261,8 @@ extern void commentScanTest();
void initDoxygen()
{
const char *lang = portable_getenv("LC_ALL");
if (lang) portable_setenv("LANG",lang);
setlocale(LC_ALL,"");
setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
setlocale(LC_NUMERIC,"C");
......
......@@ -181,7 +181,7 @@ div.groupText {
}
body {
background: white;
background-color: white;
color: black;
margin: 0;
}
......@@ -846,3 +846,32 @@ div.zoom
border: 1px solid ##A0;
}
@media print
{
#top { display: none; }
#side-nav { display: none; }
#nav-path { display: none; }
body { overflow:visible; }
h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
.summary { display: none; }
.memitem { page-break-inside: avoid; }
#doc-content
{
margin-left:0 !important;
height:auto !important;
width:auto !important;
overflow:inherit;
display:inline;
}
pre.fragment
{
overflow: visible;
text-wrap: unrestricted;
white-space: -moz-pre-wrap; /* Moz */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
white-space: pre-wrap; /* CSS3 */
word-wrap: break-word; /* IE 5.5+ */
}
}
......@@ -181,7 +181,7 @@
"}\n"
"\n"
"body {\n"
" background: white;\n"
" background-color: white;\n"
" color: black;\n"
" margin: 0;\n"
"}\n"
......@@ -846,3 +846,32 @@
" border: 1px solid ##A0;\n"
"}\n"
"\n"
"@media print\n"
"{\n"
" #top { display: none; }\n"
" #side-nav { display: none; }\n"
" #nav-path { display: none; }\n"
" body { overflow:visible; }\n"
" h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }\n"
" .summary { display: none; }\n"
" .memitem { page-break-inside: avoid; }\n"
" #doc-content\n"
" {\n"
" margin-left:0 !important;\n"
" height:auto !important;\n"
" width:auto !important;\n"
" overflow:inherit;\n"
" display:inline;\n"
" }\n"
" pre.fragment\n"
" {\n"
" overflow: visible;\n"
" text-wrap: unrestricted;\n"
" white-space: -moz-pre-wrap; /* Moz */\n"
" white-space: -pre-wrap; /* Opera 4-6 */\n"
" white-space: -o-pre-wrap; /* Opera 7 */\n"
" white-space: pre-wrap; /* CSS3 */\n"
" word-wrap: break-word; /* IE 5.5+ */\n"
" }\n"
"}\n"
"\n"
......@@ -748,25 +748,72 @@ private {
addCurrentEntry();
}
else if (!argType.isEmpty())
{ // deklaration of parameter list: add type for corr. parameter
{ // declaration of parameter list: add type for corr. parameter
parameter = getParameter(argName);
if (parameter) {
if (parameter)
{
v_type= V_PARAMETER;
if (!argType.isNull())
parameter->type=argType.stripWhiteSpace();
if (!docBlock.isNull()) {
parameter->docs += "\n";
parameter->docs += docBlock;
}
if (!argType.isNull()) parameter->type=argType.stripWhiteSpace();
if (!docBlock.isNull())
{
parameter->docs += "\n";
parameter->docs += docBlock;
}
}
// save, it may be function return type
modifiers[current_root][name.lower()].type = argType;
if (parameter)
{
modifiers[current_root][name.lower()].type = argType;
}
else
{
if ((current_root->name.lower() == argName.lower()) ||
(modifiers[current_root->parent()][current_root->name.lower()].returnName == argName.lower()))
{
int strt = current_root->type.find("function");
QString lft;
QString rght;
if (strt != -1)
{
lft = "";
rght = "";
if (strt != 0) lft = current_root->type.left(strt).stripWhiteSpace();
if ((current_root->type.length() - strt - strlen("function"))!= 0)
{
rght = current_root->type.right(current_root->type.length() - strt - strlen("function")).stripWhiteSpace();
}
current_root->type = lft;
if (rght.length() > 0)
{
if (current_root->type.length() > 0) current_root->type += " ";
current_root->type += rght;
}
if (argType.stripWhiteSpace().length() > 0)
{
if (current_root->type.length() > 0) current_root->type += " ";
current_root->type += argType.stripWhiteSpace();
}
if (current_root->type.length() > 0) current_root->type += " ";
current_root->type += "function";
}
else
{
current_root->type += " " + argType.stripWhiteSpace();
}
current_root->type = current_root->type.stripWhiteSpace();
modifiers[current_root][name.lower()].type = current_root->type;
}
else
{
modifiers[current_root][name.lower()].type = argType;
}
}
// any accumulated doc for argument should be emptied,
// because it is handled other way and this doc can be
// unexpectedly passed to the next member.
current->doc.resize(0);
current->brief.resize(0);
}
}
}
<Variable>{ARGS} { /* dimension of the previous entry. */
QCString name(argName);
......@@ -784,12 +831,12 @@ private {
BEGIN(Initialization);
}
<Variable>"\n" { currentModifiers = SymbolModifiers();
yy_pop_state(); // end variable deklaration list
yy_pop_state(); // end variable declaration list
newLine();
docBlock.resize(0);
}
<Variable>";".*"\n" { currentModifiers = SymbolModifiers();
yy_pop_state(); // end variable deklaration list
yy_pop_state(); // end variable declaration list
docBlock.resize(0);
inputStringSemi =(const char*)(yytext+1);
pushBuffer(inputStringSemi);
......@@ -856,12 +903,15 @@ private {
<SubprogPrefix>{BS}{SUBPROG}{BS_} {
// Fortran subroutine or function found
addSubprogram(yytext);
result=yytext;
result=result.stripWhiteSpace();
addSubprogram(result);
BEGIN(Subprog);
}
<Start,ModuleBody,SubprogBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains>^{BS}({PREFIX}{BS_})?{SUBPROG}{BS_} {
// Fortran subroutine or function found
v_type = V_IGNORE;
if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
{
addInterface("$interface$", ifType);
......@@ -1820,7 +1870,8 @@ static void addSubprogram(const char *text)
//fprintf(stderr,"1=========> got subprog, type: %s\n",text);
current->section = Entry::FUNCTION_SEC ;
QCString subtype = text; subtype=subtype.lower().stripWhiteSpace();
if (!current->type) current->type = subtype;
current->type += " " + subtype;
current->type = current->type.stripWhiteSpace();
current->fileName = yyFileName;
current->bodyLine = yyLineNr; // used for source reference
current->startLine = -1; // ??? what is startLine for?
......@@ -2062,8 +2113,7 @@ void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
bool FortranLanguageScanner::needsPreprocessing(const QCString &extension)
{
return !(extension==".f"||extension==".f90"||
extension==".f95"||extension==".f03");
return extension!=extension.lower(); // use preprocessor only for upper case extensions
}
void FortranLanguageScanner::resetCodeParserState()
{
......
......@@ -1109,6 +1109,58 @@ void HtmlGenerator::init()
t << svgpan_script;
}
}
if (Config_getBool("HTML_DYNAMIC_SECTIONS"))
{
QFile f(dname+"/dynsections.js");
if (f.open(IO_WriteOnly))
{
FTextStream t(&f);
t <<
"var showTriggers = new Array();\n"
"\n"
"function registerShow(sectId,showFunc) {\n"
" showTriggers[sectId] = showFunc;\n"
"}\n"
"\n"
"function hasClass(ele,cls) {\n"
" return ele.className.match(new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)'));\n"
"}\n"
"\n"
"function addClass(ele,cls) {\n"
" if (!this.hasClass(ele,cls)) ele.className += \" \"+cls;\n"
"}\n"
"\n"
"function removeClass(ele,cls) {\n"
" if (hasClass(ele,cls)) {\n"
" var reg = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n"
" ele.className=ele.className.replace(reg,' ');\n"
" }\n"
"}\n"
"\n"
"function toggleVisibility(linkObj) {\n"
" var base = linkObj.getAttribute('id');\n"
" var summary = document.getElementById(base + '-summary');\n"
" var content = document.getElementById(base + '-content');\n"
" var trigger = document.getElementById(base + '-trigger');\n"
" if ( hasClass(linkObj,'closed') ) {\n"
" summary.style.display = 'none';\n"
" content.style.display = 'block';\n"
" trigger.src = trigger.src.substring(0,trigger.src.length-10)+'open.png';\n"
" removeClass(linkObj,'closed');\n"
" addClass(linkObj,'opened');\n"
" if (showTriggers[base]) { showTriggers[base](); }\n"
" } else if ( hasClass(linkObj,'opened') ) {\n"
" summary.style.display = 'block';\n"
" content.style.display = 'none';\n"
" trigger.src = trigger.src.substring(0,trigger.src.length-8)+'closed.png';\n"
" removeClass(linkObj,'opened');\n"
" addClass(linkObj,'closed');\n"
" }\n"
" return false;\n"
"}\n";
}
}
}
/// Additional initialization after indices have been created
......@@ -1352,87 +1404,8 @@ static void generateDynamicSections(FTextStream &t,const QCString &relPath)
{
if (Config_getBool("HTML_DYNAMIC_SECTIONS"))
{
t <<
#if 0
"<script type=\"text/javascript\">\n"
"<!--\n"
"function changeDisplayState (e){\n"
" var num=this.id.replace(/[^[0-9]/g,'');\n"
" var button=this.firstChild;\n"
" var sectionDiv=document.getElementById('dynsection'+num);\n"
" if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){\n"
" sectionDiv.style.display='block';\n"
" button.src='" << relPath << "open.png';\n"
" }else{\n"
" sectionDiv.style.display='none';\n"
" button.src='" << relPath << "closed.png';\n"
" }\n"
"}\n"
"function initDynSections(){\n"
" var divs=document.getElementsByTagName('div');\n"
" var sectionCounter=1;\n"
" for(var i=0;i<divs.length-1;i++){\n"
" if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){\n"
" var header=divs[i];\n"
" var section=divs[i+1];\n"
" var button=header.firstChild;\n"
" if (button!='IMG'){\n"
" divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);\n"
" button=document.createElement('img');\n"
" divs[i].insertBefore(button,divs[i].firstChild);\n"
" }\n"
" header.style.cursor='pointer';\n"
" header.onclick=changeDisplayState;\n"
" header.id='dynheader'+sectionCounter;\n"
" button.src='" << relPath << "closed.png';\n"
" section.id='dynsection'+sectionCounter;\n"
" section.style.display='none';\n"
" section.style.marginLeft='14px';\n"
" sectionCounter++;\n"
" }\n"
" }\n"
"}\n"
"window.onload = initDynSections;\n"
"-->\n"
"</script>\n";
#endif
"<script type=\"text/javascript\">\n"
"function hasClass(ele,cls) {\n"
" return ele.className.match(new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)'));\n"
"}\n"
"\n"
"function addClass(ele,cls) {\n"
" if (!this.hasClass(ele,cls)) ele.className += \" \"+cls;\n"
"}\n"
"\n"
"function removeClass(ele,cls) {\n"
" if (hasClass(ele,cls)) {\n"
" var reg = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n"
" ele.className=ele.className.replace(reg,' ');\n"
" }\n"
"}\n"
"\n"
"function toggleVisibility(linkObj) {\n"
" var base = linkObj.getAttribute('id');\n"
" var summary = document.getElementById(base + '-summary');\n"
" var content = document.getElementById(base + '-content');\n"
" var trigger = document.getElementById(base + '-trigger');\n"
" if ( hasClass(linkObj,'closed') ) {\n"
" summary.style.display = 'none';\n"
" content.style.display = 'block';\n"
" trigger.src = '" << relPath << "open.png';\n"
" removeClass(linkObj,'closed');\n"
" addClass(linkObj,'opened');\n"
" } else if ( hasClass(linkObj,'opened') ) {\n"
" summary.style.display = 'block';\n"
" content.style.display = 'none';\n"
" trigger.src = '" << relPath << "closed.png';\n"
" removeClass(linkObj,'opened');\n"
" addClass(linkObj,'closed');\n"
" }\n"
" return false;\n"
"}\n"
"</script>\n";
t << "<script type=\"text/javascript\" src=\"" << relPath
<< "dynsections.js\"></script>\n";
}
}
......@@ -1478,10 +1451,10 @@ void HtmlGenerator::startFile(const char *name,const char *,
static bool searchEngine = Config_getBool("SEARCHENGINE");
if (searchEngine /*&& !generateTreeView*/)
{
t << "<script type=\"text/javascript\"><!--\n";
t << "<script type=\"text/javascript\">\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
<< relPath<< "search\",false,'" << theTranslator->trSearch() << "');\n";
t << "--></script>\n";
t << "</script>\n";
}
generateDynamicSections(t,relPath);
m_sectionCount=0;
......@@ -2408,7 +2381,7 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
g.writeGraph(t,BITMAP,dir,fileName,relPath);
g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,TRUE,m_sectionCount);
if (Config_getBool("GENERATE_LEGEND"))
{
t << "<center><span class=\"legend\">[";
......@@ -2434,7 +2407,7 @@ void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
g.writeGraph(t,BITMAP,dir,fileName,relPath);
g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
......@@ -2452,7 +2425,7 @@ void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
g.writeGraph(t,BITMAP,dir,fileName,relPath);
g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
......@@ -2470,7 +2443,7 @@ void HtmlGenerator::endCallGraph(const DotCallGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
g.writeGraph(t,BITMAP,dir,fileName,relPath);
g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
......@@ -2488,7 +2461,7 @@ void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
g.writeGraph(t,BITMAP,dir,fileName,relPath);
g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
......@@ -2971,10 +2944,10 @@ void HtmlGenerator::writeSearchPage()
static bool searchEngine = Config_getBool("SEARCHENGINE");
if (searchEngine /* && !generateTreeView*/)
{
t << "<script type=\"text/javascript\"><!--\n";
t << "<script type=\"text/javascript\">\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
<< "search\",false,'" << theTranslator->trSearch() << "');\n";
t << "--></script>\n";
t << "</script>\n";
}
t << "<div id=\"top\">" << endl;
writeTitleArea(t,"",projectName,projectBrief,projectNumber,projectLogo);
......
......@@ -46,9 +46,9 @@ class HtmlGenerator : public OutputGenerator
void enable()
{ if (genStack->top()) active=*genStack->top(); else active=TRUE; }
void disable() { active=FALSE; }
void enableIf(OutputType o) { if (o==Html) active=TRUE; }
void disableIf(OutputType o) { if (o==Html) active=FALSE; }
void disableIfNot(OutputType o) { if (o!=Html) active=FALSE; }
void enableIf(OutputType o) { if (o==Html) enable(); }
void disableIf(OutputType o) { if (o==Html) disable(); }
void disableIfNot(OutputType o) { if (o!=Html) disable(); }
bool isEnabled(OutputType o) { return (o==Html && active); }
OutputGenerator *get(OutputType o) { return (o==Html) ? this : 0; }
......
......@@ -1304,7 +1304,9 @@ void LatexDocVisitor::visitPost(DocParamList *pl)
void LatexDocVisitor::visitPre(DocXRefItem *x)
{
if (m_hide) return;
m_t << "\\begin{Desc}" << endl;
m_t << "\\begin{DoxyRefDesc}{";
filter(x->title());
m_t << "}" << endl;
bool anonymousEnum = x->file()=="@";
m_t << "\\item[";
if (Config_getBool("PDF_HYPERLINKS") && !anonymousEnum)
......@@ -1324,7 +1326,7 @@ void LatexDocVisitor::visitPre(DocXRefItem *x)
void LatexDocVisitor::visitPost(DocXRefItem *)
{
if (m_hide) return;
m_t << "\\end{Desc}" << endl;
m_t << "\\end{DoxyRefDesc}" << endl;
}
void LatexDocVisitor::visitPre(DocInternalRef *ref)
......
......@@ -325,7 +325,6 @@ static void writeDefaultStyleSheetPart1(FTextStream &t)
"\\RequirePackage{longtable}\n"
"\\RequirePackage{verbatim}\n"
"\\RequirePackage{ifthen}\n"
"\\RequirePackage{settobox}\n"
"\\RequirePackage[table]{xcolor}\n\n";
t << "% Use helvetica font instead of times roman\n"
......@@ -773,25 +772,30 @@ static void writeDefaultStyleSheetPart3(FTextStream &t)
t << "\\newlength{\\xreflength}\n";
t << "\\newcommand{\\xreflabel}[1]{%\n";
t << " \\sbox{\\xrefbox}{#1}%\n";
t << " \\settoboxwidth{\\xreflength}{\\xrefbox}%\n";
t << " \\setlength{\\xreflength}{\\wd\\xrefbox}%\n";
t << " \\ifthenelse{\\xreflength>\\labelwidth}{%\n";
t << " \\begin{minipage}{\\textwidth}%\n";
t << " \\setlength{\\parindent}{0pt}%\n";
t << " \\hangindent=25pt\\bfseries #1\\vspace{\\itemsep}%\n";
t << " \\hangindent=15pt\\bfseries #1\\vspace{1.2\\itemsep}%\n";
t << " \\end{minipage}%\n";
t << " }{%\n";
t << " \\parbox[b]{\\labelwidth}{\\makebox[0pt][l]{\\textbf{#1}}}%\n";
t << " }}%\n";
t << "\\newenvironment{DoxyRefList}{%\n";
t << " \\begin{list}{}{%\n";
t << " \\setlength{\\labelwidth}{75pt}%\n";
t << " \\setlength{\\labelwidth}{10pt}%\n";
t << " \\setlength{\\leftmargin}{\\labelwidth}%\n";
t << " \\addtolength{\\leftmargin}{\\labelsep}%\n";
t << " \\renewcommand{\\makelabel}{\\xreflabel}%\n";
t << " }%\n";
t << " }%\n";
t << "{\\end{list}}\n";
t << "\\newenvironment{DoxyRefDesc}[1]\n";
t << "{\\begin{list}{}{%\n";
t << " \\renewcommand\\makelabel[1]{\\textbf{##1}}\n";
t << " \\settowidth\\labelwidth{\\makelabel{#1}}\n";
t << " \\setlength\\leftmargin{\\labelwidth+\\labelsep}}}\n";
t << "{\\end{list}}\n";
t << "\\newenvironment{Indent}\n";
t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
t << " \\item[]\\ignorespaces}\n";
......
......@@ -38,9 +38,9 @@ class LatexGenerator : public OutputGenerator
void enable()
{ if (genStack->top()) active=*genStack->top(); else active=TRUE; }
void disable() { active=FALSE; }
void enableIf(OutputType o) { if (o==Latex) active=TRUE; }
void disableIf(OutputType o) { if (o==Latex) active=FALSE; }
void disableIfNot(OutputType o) { if (o!=Latex) active=FALSE; }
void enableIf(OutputType o) { if (o==Latex) enable(); }
void disableIf(OutputType o) { if (o==Latex) disable(); }
void disableIfNot(OutputType o) { if (o!=Latex) disable(); }
bool isEnabled(OutputType o) { return (o==Latex && active); }
OutputGenerator *get(OutputType o) { return (o==Latex) ? this : 0; }
......
......@@ -511,10 +511,12 @@ class LayoutParser : public QXmlDefaultHandler
MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
m_sHandler.insert("file/memberdef/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
MemberList::docEnumMembers,
theTranslator->trEnumerationTypeDocumentation()));
m_sHandler.insert("file/memberdef/functions",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberList::docFuncMembers,theTranslator->trFunctionDocumentation()));
MemberList::docFuncMembers,
fortranOpt ? theTranslator->trSubprogramDocumentation() : theTranslator->trFunctionDocumentation()));
m_sHandler.insert("file/memberdef/variables",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
......
......@@ -34,9 +34,9 @@ class ManGenerator : public OutputGenerator
void enable()
{ if (genStack->top()) active=*genStack->top(); else active=TRUE; }
void disable() { active=FALSE; }
void enableIf(OutputType o) { if (o==Man) active=TRUE; }
void disableIf(OutputType o) { if (o==Man) active=FALSE; }
void disableIfNot(OutputType o) { if (o!=Man) active=FALSE; }
void enableIf(OutputType o) { if (o==Man) enable(); }
void disableIf(OutputType o) { if (o==Man) disable(); }
void disableIfNot(OutputType o) { if (o!=Man) disable(); }
bool isEnabled(OutputType o) { return (o==Man && active); }
OutputGenerator *get(OutputType o) { return (o==Man) ? this : 0; }
......
......@@ -58,6 +58,7 @@ void OutputGenerator::startPlainFile(const char *name)
void OutputGenerator::endPlainFile()
{
t.unsetDevice();
delete file;
file=0;
fileName.resize(0);
......@@ -66,12 +67,12 @@ void OutputGenerator::endPlainFile()
void OutputGenerator::pushGeneratorState()
{
genStack->push(new bool(isEnabled()));
//printf("%p:pushGeneratorState(%d)\n",this,genStack->count());
//printf("%p:pushGeneratorState(%d) enabled=%d\n",this,genStack->count(),isEnabled());
}
void OutputGenerator::popGeneratorState()
{
//printf("%p:popGeneratorState(%d)\n",this,genStack->count());
//printf("%p:popGeneratorState(%d) enabled=%d\n",this,genStack->count(),isEnabled());
bool *lb = genStack->pop();
ASSERT(lb!=0);
if (lb==0) return; // for some robustness against superfluous \endhtmlonly commands.
......
......@@ -33,6 +33,7 @@ static QCString makeFileName(const char * withoutExtension)
static QCString makeRef(const char * withoutExtension, const char * anchor)
{
//printf("QHP::makeRef(%s,%s)\n",withoutExtension,anchor);
if (!withoutExtension) return QCString();
QCString result = makeFileName(withoutExtension);
if (!anchor) return result;
......@@ -191,6 +192,10 @@ void Qhp::addIndexItem(Definition *context,MemberDef *md,
const char *word)
{
(void)word;
//printf("addIndexItem(%s %s %s\n",
// context?context->name().data():"<none>",
// md?md->name().data():"<none>",
// word);
if (md) // member
{
......
......@@ -2652,13 +2652,19 @@ void RTFGenerator::endParamList()
void RTFGenerator::startParameterType(bool first,const char *key)
{
DBG_RTF(t << "{\\comment (startParameterList)}" << endl)
DBG_RTF(t << "{\\comment (startParameterType)}" << endl)
if (!first && key)
{
t << " " << key << " ";
}
}
void RTFGenerator::endParameterType()
{
DBG_RTF(t << "{\\comment (endParameterType)}" << endl)
t << " ";
}
void RTFGenerator::printDoc(DocNode *n,const char *langExt)
{
RTFDocVisitor *visitor = new RTFDocVisitor(t,*this,langExt);
......
......@@ -34,9 +34,9 @@ class RTFGenerator : public OutputGenerator
void enable()
{ if (genStack->top()) active=*genStack->top(); else active=TRUE; }
void disable() { active=FALSE; }
void enableIf(OutputType o) { if (o==RTF) active=TRUE; }
void disableIf(OutputType o) { if (o==RTF) active=FALSE; }
void disableIfNot(OutputType o) { if (o!=RTF) active=FALSE; }
void enableIf(OutputType o) { if (o==RTF) enable(); }
void disableIf(OutputType o) { if (o==RTF) disable(); }
void disableIfNot(OutputType o) { if (o!=RTF) disable(); }
bool isEnabled(OutputType o) { return (o==RTF && active); }
OutputGenerator *get(OutputType o) { return (o==RTF) ? this : 0; }
......@@ -219,7 +219,7 @@ class RTFGenerator : public OutputGenerator
void startMemberDocName(bool) {}
void endMemberDocName() {}
void startParameterType(bool,const char *);
void endParameterType() {}
void endParameterType();
void startParameterName(bool) {}
void endParameterName(bool,bool,bool) {}
void startParameterList(bool) {}
......
......@@ -5064,7 +5064,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
new BaseInfo(baseName,baseProt,baseVirt)
);
}
if ((current->spec & Entry::Interface) ||
if ((current->spec & (Entry::Interface|Entry::Struct)) ||
insideJava || insidePHP || insideCS ||
insideD || insideObjC)
{
......
......@@ -240,7 +240,7 @@ function SearchBox(name, resultsPath, inFrame, label)
var node = child.firstChild;
if (j==id)
{
node.innerHTML='&bull;';
node.innerHTML='&#8226;';
}
else
{
......@@ -337,7 +337,7 @@ function SearchBox(name, resultsPath, inFrame, label)
hasResultsPage = false;
}
window.frames.MSearchResults.location.href = resultsPageWithSearch;
window.frames.MSearchResults.location = resultsPageWithSearch;
var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
if (domPopupSearchResultsWindow.style.display!='block')
......
......@@ -240,7 +240,7 @@
" var node = child.firstChild;\n"
" if (j==id)\n"
" {\n"
" node.innerHTML='&bull;';\n"
" node.innerHTML='&#8226;';\n"
" }\n"
" else\n"
" {\n"
......@@ -337,7 +337,7 @@
" hasResultsPage = false;\n"
" }\n"
"\n"
" window.frames.MSearchResults.location.href = resultsPageWithSearch; \n"
" window.frames.MSearchResults.location = resultsPageWithSearch; \n"
" var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();\n"
"\n"
" if (domPopupSearchResultsWindow.style.display!='block')\n"
......
/**
* The code below is based on SVGPan Library 1.2 and was modified for doxygen
* to support both zooming and panning via the mouse and via embedded bottons.
*
* This code is licensed under the following BSD license:
*
......@@ -46,11 +47,10 @@ var maxZoom;
if (!window) window=this;
/**
* Register handlers
* Show the graph in the middle of the view, scaled to fit
*/
function init(evt)
function show()
{
svgDoc = evt.target.ownerDocument;
if (window.innerHeight) // Firefox
{
windowWidth = window.innerWidth;
......@@ -61,21 +61,39 @@ function init(evt)
windowWidth = document.documentElement.clientWidth
windowHeight = document.documentElement.clientHeight
}
else
if (!windowWidth || !windowHeight) // failsafe
{
windowWidth = 800;
windowHeight = 600;
}
minZoom = windowHeight/viewHeight;
maxZoom = 1.5;
minZoom = Math.min(windowHeight/viewHeight,windowWidth/viewWidth);
maxZoom = minZoom+1.5;
zoomInFactor = Math.pow(maxZoom/minZoom,1.0/zoomSteps);
zoomOutFactor = 1.0/zoomInFactor;
var g = svgDoc.getElementById('viewport');
var bb = g.getBBox();
var a = 'scale('+minZoom+') rotate(0) translate('+((innerWidth-viewWidth*minZoom)/(2*minZoom))+' '+viewHeight+')';
try
{
var bb = g.getBBox(); // this can throw an exception if css { display: none }
var tx = (windowWidth-viewWidth*minZoom+8)/(2*minZoom);
var ty = viewHeight+(windowHeight-viewHeight*minZoom)/(2*minZoom);
var a = 'scale('+minZoom+') rotate(0) translate('+tx+' '+ty+')';
g.setAttribute('transform',a);
}
catch(e) {}
}
g.setAttribute('transform',a);
/**
* Register handlers
*/
function init(evt)
{
svgDoc = evt.target.ownerDocument;
if (top.window && top.window.registerShow) // register show function in html doc for dynamic sections
{
top.window.registerShow(sectionId,show);
}
show();
setAttributes(root, {
"onmousedown" : "handleMouseDown(evt)",
......@@ -85,36 +103,22 @@ function init(evt)
if (window.addEventListener)
{
if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || navigator.userAgent.toLowerCase().indexOf("opera") >= 0)
window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari
if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 ||
navigator.userAgent.toLowerCase().indexOf("opera") >= 0 ||
navigator.appVersion.indexOf("MSIE") != -1)
{
window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari/IE9
}
else
{
window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others
}
}
}
window.onresize=function()
{
if (svgDoc)
{
var newWindowWidth;
if (window.innerWidth) // Firefox
{
newWindowWidth = window.innerWidth;
}
else if (document.documentElement.clientWidth) // Chrome/Safari
{
newWindowWidth = document.documentElement.clientWidth
}
if (newWindowWidth)
{
var g = svgDoc.getElementById("viewport");
var n = g.getCTM();
n = n.translate((newWindowWidth-windowWidth)/(2*minZoom),0);
setCTM(g, n);
stateTf = stateTf.multiply(n.inverse());
windowWidth = newWindowWidth;
}
}
if (svgDoc) { show(); }
}
/**
......@@ -178,9 +182,14 @@ function handleMouseWheel(evt)
{
delta = evt.wheelDelta / 720; // Opera
}
else if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1 ||
navigator.appVersion.indexOf("MSIE") != -1)
{
delta = evt.wheelDelta / 7200; // Chrome/IE9
}
else
{
delta = evt.wheelDelta / 7200; // Chrome/Safari/Opera
delta = evt.wheelDelta / 72000; // Safari
}
}
else
......@@ -243,6 +252,18 @@ function handleMouseUp(evt)
state = '';
}
/**
* Dumps a matrix to a string (useful for debug).
*/
function dumpMatrix(matrix)
{
var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]";
return s;
}
/**
* Handler for pan buttons
*/
function handlePan(x,y)
{
var g = svgDoc.getElementById("viewport");
......@@ -250,22 +271,25 @@ function handlePan(x,y)
}
/**
* Dumps a matrix to a string (useful for debug).
* Handle reset button
*/
function dumpMatrix(matrix)
function handleReset()
{
var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]";
return s;
show();
}
/**
* Handler for zoom buttons
*/
function handleZoom(evt,direction)
{
var g = svgDoc.getElementById("viewport");
var factor = direction=='in' ? zoomInFactor : zoomOutFactor;
var m = g.getCTM();
var p = root.createSVGPoint();
p.x = windowWidth/2;
p.x = windowWidth/2;
p.y = windowHeight/2;
doZoom(g,p,factor);
}
"/**\n"
" * The code below is based on SVGPan Library 1.2 and was modified for doxygen\n"
" * to support both zooming and panning via the mouse and via embedded bottons.\n"
" *\n"
" * This code is licensed under the following BSD license:\n"
" *\n"
......@@ -46,11 +47,10 @@
"if (!window) window=this;\n"
"\n"
"/**\n"
" * Register handlers\n"
" * Show the graph in the middle of the view, scaled to fit \n"
" */\n"
"function init(evt) \n"
"function show()\n"
"{\n"
" svgDoc = evt.target.ownerDocument;\n"
" if (window.innerHeight) // Firefox\n"
" {\n"
" windowWidth = window.innerWidth;\n"
......@@ -61,21 +61,39 @@
" windowWidth = document.documentElement.clientWidth\n"
" windowHeight = document.documentElement.clientHeight\n"
" }\n"
" else\n"
" if (!windowWidth || !windowHeight) // failsafe\n"
" {\n"
" windowWidth = 800;\n"
" windowHeight = 600;\n"
" }\n"
" minZoom = windowHeight/viewHeight;\n"
" maxZoom = 1.5;\n"
" minZoom = Math.min(windowHeight/viewHeight,windowWidth/viewWidth);\n"
" maxZoom = minZoom+1.5;\n"
" zoomInFactor = Math.pow(maxZoom/minZoom,1.0/zoomSteps);\n"
" zoomOutFactor = 1.0/zoomInFactor;\n"
"\n"
" var g = svgDoc.getElementById('viewport');\n"
" var bb = g.getBBox();\n"
" var a = 'scale('+minZoom+') rotate(0) translate('+((innerWidth-viewWidth*minZoom)/(2*minZoom))+' '+viewHeight+')';\n"
" try\n"
" {\n"
" var bb = g.getBBox(); // this can throw an exception if css { display: none }\n"
" var tx = (windowWidth-viewWidth*minZoom+8)/(2*minZoom);\n"
" var ty = viewHeight+(windowHeight-viewHeight*minZoom)/(2*minZoom);\n"
" var a = 'scale('+minZoom+') rotate(0) translate('+tx+' '+ty+')';\n"
" g.setAttribute('transform',a);\n"
" }\n"
" catch(e) {}\n"
"}\n"
"\n"
" g.setAttribute('transform',a);\n"
"/**\n"
" * Register handlers\n"
" */\n"
"function init(evt) \n"
"{\n"
" svgDoc = evt.target.ownerDocument;\n"
" if (top.window && top.window.registerShow) // register show function in html doc for dynamic sections\n"
" {\n"
" top.window.registerShow(sectionId,show);\n"
" }\n"
" show();\n"
"\n"
" setAttributes(root, {\n"
" \"onmousedown\" : \"handleMouseDown(evt)\",\n"
......@@ -85,36 +103,22 @@
"\n"
" if (window.addEventListener)\n"
" {\n"
" if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || navigator.userAgent.toLowerCase().indexOf(\"opera\") >= 0)\n"
" window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari\n"
" if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || \n"
" navigator.userAgent.toLowerCase().indexOf(\"opera\") >= 0 || \n"
" navigator.appVersion.indexOf(\"MSIE\") != -1)\n"
" {\n"
" window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari/IE9\n"
" }\n"
" else\n"
" {\n"
" window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others\n"
" }\n"
" }\n"
"}\n"
"\n"
"window.onresize=function()\n"
"{\n"
" if (svgDoc)\n"
" {\n"
" var newWindowWidth;\n"
" if (window.innerWidth) // Firefox\n"
" {\n"
" newWindowWidth = window.innerWidth;\n"
" }\n"
" else if (document.documentElement.clientWidth) // Chrome/Safari\n"
" {\n"
" newWindowWidth = document.documentElement.clientWidth\n"
" }\n"
" if (newWindowWidth)\n"
" {\n"
" var g = svgDoc.getElementById(\"viewport\");\n"
" var n = g.getCTM();\n"
" n = n.translate((newWindowWidth-windowWidth)/(2*minZoom),0);\n"
" setCTM(g, n);\n"
" stateTf = stateTf.multiply(n.inverse());\n"
" windowWidth = newWindowWidth;\n"
" }\n"
" }\n"
" if (svgDoc) { show(); }\n"
"}\n"
"\n"
"/**\n"
......@@ -178,9 +182,14 @@
" {\n"
" delta = evt.wheelDelta / 720; // Opera\n"
" }\n"
" else if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1 ||\n"
" navigator.appVersion.indexOf(\"MSIE\") != -1)\n"
" {\n"
" delta = evt.wheelDelta / 7200; // Chrome/IE9\n"
" }\n"
" else\n"
" {\n"
" delta = evt.wheelDelta / 7200; // Chrome/Safari/Opera\n"
" delta = evt.wheelDelta / 72000; // Safari\n"
" }\n"
" }\n"
" else\n"
......@@ -243,6 +252,18 @@
" state = '';\n"
"}\n"
"\n"
"/**\n"
" * Dumps a matrix to a string (useful for debug).\n"
" */\n"
"function dumpMatrix(matrix) \n"
"{\n"
" var s = \"[ \" + matrix.a + \", \" + matrix.c + \", \" + matrix.e + \"\\n \" + matrix.b + \", \" + matrix.d + \", \" + matrix.f + \"\\n 0, 0, 1 ]\";\n"
" return s;\n"
"}\n"
"\n"
"/**\n"
" * Handler for pan buttons\n"
" */\n"
"function handlePan(x,y)\n"
"{\n"
" var g = svgDoc.getElementById(\"viewport\");\n"
......@@ -250,22 +271,25 @@
"}\n"
"\n"
"/**\n"
" * Dumps a matrix to a string (useful for debug).\n"
" * Handle reset button\n"
" */\n"
"function dumpMatrix(matrix) \n"
"function handleReset()\n"
"{\n"
" var s = \"[ \" + matrix.a + \", \" + matrix.c + \", \" + matrix.e + \"\\n \" + matrix.b + \", \" + matrix.d + \", \" + matrix.f + \"\\n 0, 0, 1 ]\";\n"
" return s;\n"
" show();\n"
"}\n"
"\n"
"/**\n"
" * Handler for zoom buttons\n"
" */\n"
"function handleZoom(evt,direction)\n"
"{\n"
" var g = svgDoc.getElementById(\"viewport\");\n"
" var factor = direction=='in' ? zoomInFactor : zoomOutFactor;\n"
" var m = g.getCTM();\n"
" var p = root.createSVGPoint();\n"
" p.x = windowWidth/2; \n"
" p.x = windowWidth/2;\n"
" p.y = windowHeight/2;\n"
" doZoom(g,p,factor);\n"
"}\n"
"\n"
"\n"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment