diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2011-06-06 19:49:53 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2011-06-06 19:49:53 (GMT) |
commit | 0bb78ec1f61b95b550b65361081c01a104728341 (patch) | |
tree | b158d4e26359c261b119f485d1d4c69a6034663c /src | |
parent | 3c0d4d412c7b6c2afa9e76fcfd5ef5ea8586ad68 (diff) | |
download | Doxygen-0bb78ec1f61b95b550b65361081c01a104728341.zip Doxygen-0bb78ec1f61b95b550b65361081c01a104728341.tar.gz Doxygen-0bb78ec1f61b95b550b65361081c01a104728341.tar.bz2 |
Release-1.7.4-20110606
Diffstat (limited to 'src')
49 files changed, 3233 insertions, 325 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index 5c75ebb..34dcee3 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -383,7 +383,8 @@ void ClassDef::internalInsertMember(MemberDef *md, } } - if (!isReference()) + if (1 /*!isReference()*/) // changed to 1 for showing members of external + // classes when HAVE_DOT and UML_LOOK are enabled. { static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); @@ -2865,8 +2866,11 @@ void ClassDef::mergeCategory(ClassDef *category) //---------------------------------------------------------------------------- -void ClassDef::addUsedClass(ClassDef *cd,const char *accessName) +void ClassDef::addUsedClass(ClassDef *cd,const char *accessName, + Protection prot) { + static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); + if (prot==Private && !extractPrivate) return; //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName); if (m_impl->usesImplClassDict==0) { @@ -2884,8 +2888,11 @@ void ClassDef::addUsedClass(ClassDef *cd,const char *accessName) ucd->addAccessor(accessName); } -void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName) +void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName, + Protection prot) { + static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); + if (prot==Private && !extractPrivate) return; //printf("%s::addUsedByClass(%s,%s)\n",name().data(),cd->name().data(),accessName); if (m_impl->usedByImplClassDict==0) { @@ -3854,6 +3861,11 @@ void ClassDef::setUsedOnly(bool b) m_impl->usedOnly = b; } +SrcLangExt ClassDef::getLanguage() const +{ + return m_impl->lang; +} + bool ClassDef::isUsedOnly() const { return m_impl->usedOnly; diff --git a/src/classdef.h b/src/classdef.h index 7b5ce86..fcb8d4c 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -267,6 +267,8 @@ class ClassDef : public Definition QCString anchor() const; bool isEmbeddedInGroupDocs() const; + SrcLangExt getLanguage() const; + //----------------------------------------------------------------------------------- // --- setters ---- //----------------------------------------------------------------------------------- @@ -286,8 +288,8 @@ class ClassDef : public Definition void addInnerCompound(Definition *d); ClassDef *insertTemplateInstance(const QCString &fileName,int startLine, const QCString &templSpec,bool &freshInstance); - void addUsedClass(ClassDef *cd,const char *accessName); - void addUsedByClass(ClassDef *cd,const char *accessName); + void addUsedClass(ClassDef *cd,const char *accessName,Protection prot); + void addUsedByClass(ClassDef *cd,const char *accessName,Protection prot); void setIsStatic(bool b); void setLanguage(SrcLangExt lang); void setCompoundType(CompoundType t); diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index c06d33e..d45bccc 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -65,6 +65,7 @@ CommandMap cmdMap[] = { "param", CMD_PARAM }, { "post", CMD_POST }, { "pre", CMD_PRE }, + { "copyright", CMD_COPYRIGHT }, { "ref", CMD_REF }, { "refitem", CMD_SECREFITEM }, { "remark", CMD_REMARK }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 3b01030..0a398f5 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -77,7 +77,7 @@ enum CommandType CMD_PARAM = 43 | SIMPLESECT_BIT, CMD_PERCENT = 44, CMD_POST = 45 | SIMPLESECT_BIT, - CMD_PRE = 46 | SIMPLESECT_BIT , + CMD_PRE = 46 | SIMPLESECT_BIT, CMD_REF = 47, CMD_SECREFITEM = 48, CMD_REMARK = 49 | SIMPLESECT_BIT , @@ -115,7 +115,8 @@ enum CommandType CMD_COPYDETAILS = 81, CMD_QUOTE = 82, CMD_MSCFILE = 83, - CMD_DCOLON = 84 + CMD_DCOLON = 84, + CMD_COPYRIGHT = 85 | SIMPLESECT_BIT, }; enum HtmlTagType @@ -1793,7 +1793,7 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP} codifyLines(yytext); endFontClass(); } -<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"){B}+ { +<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"|"interface"){B}+ { startFontClass("keyword"); codifyLines(yytext); endFontClass(); diff --git a/src/compound.xsd b/src/compound.xsd index 65fc0bf..493fc4e 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -764,6 +764,7 @@ <xsd:enumeration value="warning" /> <xsd:enumeration value="pre" /> <xsd:enumeration value="post" /> + <xsd:enumeration value="copyright" /> <xsd:enumeration value="invariant" /> <xsd:enumeration value="remark" /> <xsd:enumeration value="attention" /> diff --git a/src/compound_xsd.h b/src/compound_xsd.h index c157054..e84e21f 100644 --- a/src/compound_xsd.h +++ b/src/compound_xsd.h @@ -764,6 +764,7 @@ " <xsd:enumeration value=\"warning\" />\n" " <xsd:enumeration value=\"pre\" />\n" " <xsd:enumeration value=\"post\" />\n" +" <xsd:enumeration value=\"copyright\" />\n" " <xsd:enumeration value=\"invariant\" />\n" " <xsd:enumeration value=\"remark\" />\n" " <xsd:enumeration value=\"attention\" />\n" diff --git a/src/config.xml b/src/config.xml index 2883b83..6893283 100644 --- a/src/config.xml +++ b/src/config.xml @@ -626,6 +626,7 @@ If left blank NO is used. The EXCLUDE tag can be used to specify files and/or directories that should excluded from the INPUT source files. This way you can easily exclude a subdirectory from a directory tree whose root is specified with the INPUT tag. +Note that relative paths are relative to directory from which doxygen is run. '> </option> <option type='bool' id='EXCLUDE_SYMLINKS' docs=' @@ -1493,6 +1494,12 @@ If left blank png will be used. <value name='gif'/> <value name='svg'/> </option> + <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. +' 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 found. If left blank, it is assumed the dot tool can be found in the path. diff --git a/src/configoptions.cpp b/src/configoptions.cpp index 15c6424..2afa94a 100644 --- a/src/configoptions.cpp +++ b/src/configoptions.cpp @@ -886,7 +886,8 @@ void addConfigOptions(Config *cfg) "EXCLUDE", "The EXCLUDE tag can be used to specify files and/or directories that should\n" "excluded from the INPUT source files. This way you can easily exclude a\n" - "subdirectory from a directory tree whose root is specified with the INPUT tag." + "subdirectory from a directory tree whose root is specified with the INPUT tag.\n" + "Note that relative paths are relative to directory from which doxygen is run." ); cl->setWidgetType(ConfigList::FileAndDir); //---- @@ -2268,6 +2269,13 @@ void addConfigOptions(Config *cfg) ce->addValue("svg"); ce->addDependency("HAVE_DOT"); //---- + cb = cfg->addBool( + "INTERACTIVE_SVG", + "", + FALSE + ); + cb->addDependency("HAVE_DOT"); + //---- cs = cfg->addString( "DOT_PATH", "The tag DOT_PATH can be used to specify the path where the dot tool can be\n" diff --git a/src/definition.cpp b/src/definition.cpp index ec00885..70a46d8 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -1069,7 +1069,7 @@ void Definition::addSourceReferencedBy(MemberDef *md) } if (m_impl->sourceRefByDict->find(name)==0) { - m_impl->sourceRefByDict->inSort(name,md); + m_impl->sourceRefByDict->append(name,md); } } } @@ -1093,7 +1093,7 @@ void Definition::addSourceReferences(MemberDef *md) } if (m_impl->sourceRefsDict->find(name)==0) { - m_impl->sourceRefsDict->inSort(name,md); + m_impl->sourceRefsDict->append(name,md); } } } diff --git a/src/docparser.cpp b/src/docparser.cpp index d6f31df..c50c34c 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -1138,6 +1138,56 @@ static void handleParameterType(DocNode *parent,QList<DocNode> &children,const Q g_token->name = name; } +static DocInternalRef *handleInternalRef(DocNode *parent) +{ + //printf("CMD_INTERNALREF\n"); + int tok=doctokenizerYYlex(); + QCString tokenName = g_token->name; + if (tok!=TK_WHITESPACE) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", + qPrint(tokenName)); + return 0; + } + doctokenizerYYsetStateInternalRef(); + tok=doctokenizerYYlex(); // get the reference id + if (tok!=TK_WORD && tok!=TK_LNKWORD) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", + tokToString(tok),qPrint(tokenName)); + return 0; + } + return new DocInternalRef(parent,g_token->name); +} + +static DocAnchor *handleAnchor(DocNode *parent) +{ + int tok=doctokenizerYYlex(); + QCString tokenName = g_token->name; + if (tok!=TK_WHITESPACE) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", + qPrint(tokenName)); + return 0; + } + doctokenizerYYsetStateAnchor(); + tok=doctokenizerYYlex(); + if (tok==0) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the " + "argument of command %s",qPrint(tokenName)); + return 0; + } + else if (tok!=TK_WORD && tok!=TK_LNKWORD) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", + tokToString(tok),qPrint(tokenName)); + return 0; + } + doctokenizerYYsetStatePara(); + return new DocAnchor(parent,g_token->name,FALSE); +} + /* Helper function that deals with the most common tokens allowed in * title like sections. @@ -1284,52 +1334,21 @@ reparsetoken: break; case CMD_ANCHOR: { - tok=doctokenizerYYlex(); - if (tok!=TK_WHITESPACE) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", - qPrint(tokenName)); - break; - } - tok=doctokenizerYYlex(); - if (tok==0) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the " - "argument of command %s",qPrint(tokenName)); - break; - } - else if (tok!=TK_WORD && tok!=TK_LNKWORD) + DocAnchor *anchor = handleAnchor(parent); + if (anchor) { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", - tokToString(tok),qPrint(tokenName)); - break; + children.append(anchor); } - DocAnchor *anchor = new DocAnchor(parent,g_token->name,FALSE); - children.append(anchor); } break; case CMD_INTERNALREF: { - tok=doctokenizerYYlex(); - if (tok!=TK_WHITESPACE) + DocInternalRef *ref = handleInternalRef(parent); + if (ref) { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", - qPrint(tokenName)); - break; + children.append(ref); + ref->parse(); } - doctokenizerYYsetStateInternalRef(); - tok=doctokenizerYYlex(); // get the reference id - DocInternalRef *ref=0; - if (tok!=TK_WORD && tok!=TK_LNKWORD) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", - tokToString(tok),qPrint(tokenName)); - doctokenizerYYsetStatePara(); - break; - } - ref = new DocInternalRef(parent,g_token->name); - children.append(ref); - ref->parse(); doctokenizerYYsetStatePara(); } break; @@ -4160,6 +4179,7 @@ QCString DocSimpleSect::typeString() const case Warning: return "warning"; case Pre: return "pre"; case Post: return "post"; + case Copyright: return "copyright"; case Invar: return "invariant"; case Remark: return "remark"; case Attention: return "attention"; @@ -4840,6 +4860,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_POST: retval = handleSimpleSection(DocSimpleSect::Post); break; + case CMD_COPYRIGHT: + retval = handleSimpleSection(DocSimpleSect::Copyright); + break; case CMD_INVARIANT: retval = handleSimpleSection(DocSimpleSect::Invar); break; @@ -4988,28 +5011,11 @@ int DocPara::handleCommand(const QCString &cmdName) break; case CMD_ANCHOR: { - int tok=doctokenizerYYlex(); - if (tok!=TK_WHITESPACE) + DocAnchor *anchor = handleAnchor(this); + if (anchor) { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", - qPrint(cmdName)); - break; + m_children.append(anchor); } - tok=doctokenizerYYlex(); - if (tok==0) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the " - "argument of command %s",qPrint(cmdName)); - break; - } - else if (tok!=TK_WORD && tok!=TK_LNKWORD) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", - tokToString(tok),qPrint(cmdName)); - break; - } - DocAnchor *anchor = new DocAnchor(this,g_token->name,FALSE); - m_children.append(anchor); } break; case CMD_ADDINDEX: @@ -5124,7 +5130,16 @@ int DocPara::handleCommand(const QCString &cmdName) // retval = handleLanguageSwitch(); // break; case CMD_INTERNALREF: - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name)); + //warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name)); + { + DocInternalRef *ref = handleInternalRef(this); + if (ref) + { + m_children.append(ref); + ref->parse(); + } + doctokenizerYYsetStatePara(); + } break; case CMD_INHERITDOC: handleInheritDoc(); diff --git a/src/docparser.h b/src/docparser.h index 6ad4457..9adb540 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -886,7 +886,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode enum Type { Unknown, See, Return, Author, Authors, Version, Since, Date, - Note, Warning, Pre, Post, Invar, Remark, Attention, User, Rcs + Note, Warning, Copyright, Pre, Post, Invar, Remark, Attention, User, Rcs }; DocSimpleSect(DocNode *parent,Type t); virtual ~DocSimpleSect(); diff --git a/src/doctokenizer.h b/src/doctokenizer.h index c639695..496e209 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -145,6 +145,7 @@ void doctokenizerYYsetStateRef(); void doctokenizerYYsetStateInternalRef(); void doctokenizerYYsetStateText(); void doctokenizerYYsetStateSkipTitle(); +void doctokenizerYYsetStateAnchor(); void doctokenizerYYsetInsidePre(bool b); void doctokenizerYYpushBackHtmlTag(const char *tag); diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 1ede3b4..6de1627 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -377,6 +377,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} %x St_IntRef %x St_Text %x St_SkipTitle +%x St_Anchor %x St_Sections %s St_SecLabel1 @@ -724,6 +725,14 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} return 0; } +<St_Anchor>{LABELID}{WS}? { // anchor + g_token->name = QCString(yytext).stripWhiteSpace(); + return TK_WORD; + } +<St_Anchor>. { + unput(*yytext); + return 0; + } <St_Ref>{REFWORD} { // label to refer to g_token->name=yytext; return TK_WORD; @@ -1090,6 +1099,11 @@ void doctokenizerYYsetStateSkipTitle() BEGIN(St_SkipTitle); } +void doctokenizerYYsetStateAnchor() +{ + BEGIN(St_Anchor); +} + void doctokenizerYYcleanup() { yy_delete_buffer( YY_CURRENT_BUFFER ); diff --git a/src/dot.cpp b/src/dot.cpp index 744b95f..1e17d15 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -54,10 +54,72 @@ //-------------------------------------------------------------------- +static const char svgZoomHeader[] = +"<svg id=\"main\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" onload=\"init(evt)\">\n" +" <defs>\n" +" <circle id=\"rim\" cx=\"0\" cy=\"0\" r=\"7\"/>\n" +" <g id=\"zoomPlus\">\n" +" <use xlink:href=\"#rim\" fill=\"#404040\">\n" +" <set attributeName=\"fill\" to=\"#808080\" begin=\"zoomplus.mouseover\" end=\"zoomplus.mouseout\"/>\n" +" </use>\n" +" <path d=\"M-4,0h8M0,-4v8\" fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" pointer-events=\"none\"/>\n" +" </g>\n" +" <g id=\"zoomMin\">\n" +" <use xlink:href=\"#rim\" fill=\"#404040\">\n" +" <set attributeName=\"fill\" to=\"#808080\" begin=\"zoomminus.mouseover\" end=\"zoomminus.mouseout\"/>\n" +" </use>\n" +" <path d=\"M-4,0h8\" fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" pointer-events=\"none\"/>\n" +" </g>\n" +" <g id=\"dirArrow\">\n" +" <use xlink:href=\"#rim\" fill=\"#404040\">\n" +" <set attributeName=\"fill\" to=\"#808080\" begin=\"zoomminus.mouseover\" end=\"zoomminus.mouseout\"/>\n" +" </use>\n" +" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n" +" </g>\n" +" </defs>\n" +"\n" +"<script type=\"text/javascript\">\n" +; + +static const char svgZoomFooter[] = +" <g id=\"navigator\" transform=\"translate(0 0)\" fill=\"#404254\">\n" +" <rect fill=\"#f2f5e9\" fill-opacity=\"0.5\" stroke=\"#606060\" stroke-width=\".5\" x=\"0\" y=\"0\" width=\"60\" height=\"60\"/>\n" +" <use id=\"zoomplus\" xlink:href=\"#zoomPlus\" x=\"17\" y=\"9\" onmousedown=\"handleZoom(evt,'in')\"/>\n" +" <use id=\"zoomminus\" xlink:href=\"#zoomMin\" x=\"42\" y=\"9\" onmousedown=\"handleZoom(evt,'out')\"/>\n" +" <g id=\"arrowUp\" xlink:href=\"#dirArrow\" transform=\"translate(30 24)\" onmousedown=\"handlePan(0,-1)\">\n" +" <use xlink:href=\"#rim\" fill=\"#404040\">\n" +" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowUp.mouseover\" end=\"arrowUp.mouseout\"/>\n" +" </use>\n" +" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n" +" </g>\n" +" <g id=\"arrowRight\" xlink:href=\"#dirArrow\" transform=\"rotate(90) translate(36 -43)\" onmousedown=\"handlePan(1,0)\">\n" +" <use xlink:href=\"#rim\" fill=\"#404040\">\n" +" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowRight.mouseover\" end=\"arrowRight.mouseout\"/>\n" +" </use>\n" +" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n" +" </g>\n" +" <g id=\"arrowDown\" xlink:href=\"#dirArrow\" transform=\"rotate(180) translate(-30 -48)\" onmousedown=\"handlePan(0,1)\">\n" +" <use xlink:href=\"#rim\" fill=\"#404040\">\n" +" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowDown.mouseover\" end=\"arrowDown.mouseout\"/>\n" +" </use>\n" +" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n" +" </g>\n" +" <g id=\"arrowLeft\" xlink:href=\"#dirArrow\" transform=\"rotate(270) translate(-36 17)\" onmousedown=\"handlePan(-1,0)\">\n" +" <use xlink:href=\"#rim\" fill=\"#404040\">\n" +" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowLeft.mouseover\" end=\"arrowLeft.mouseout\"/>\n" +" </use>\n" +" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n" +" </g>\n" +" </g>\n" +"</svg>\n" +; + +//-------------------------------------------------------------------- + static const int maxCmdLine = 40960; /*! mapping from protection levels to color names */ -static const char *edgeColorMap[] = +static const char *normalEdgeColorMap[] = { "midnightblue", // Public "darkgreen", // Protected @@ -67,7 +129,7 @@ static const char *edgeColorMap[] = "orange" // template relation }; -static const char *arrowStyle[] = +static const char *normalArrowStyleMap[] = { "empty", // Public "empty", // Protected @@ -77,12 +139,56 @@ static const char *arrowStyle[] = 0 // template relation }; -static const char *edgeStyleMap[] = +static const char *normalEdgeStyleMap[] = { "solid", // inheritance "dashed" // usage }; +static const char *umlEdgeColorMap[] = +{ + "midnightblue", // Public + "darkgreen", // Protected + "firebrick4", // Private + "grey25", // "use" relation + "grey75", // Undocumented + "orange" // template relation +}; + +static const char *umlArrowStyleMap[] = +{ + "onormal", // Public + "onormal", // Protected + "onormal", // Private + "odiamond", // "use" relation + 0, // Undocumented + 0 // template relation +}; + +static const char *umlEdgeStyleMap[] = +{ + "solid", // inheritance + "solid" // usage +}; + +struct EdgeProperties +{ + const char * const *edgeColorMap; + const char * const *arrowStyleMap; + const char * const *edgeStyleMap; +}; + +static EdgeProperties normalEdgeProps = +{ + normalEdgeColorMap, normalArrowStyleMap, normalEdgeStyleMap +}; + +static EdgeProperties umlEdgeProps = +{ + umlEdgeColorMap, umlArrowStyleMap, umlEdgeStyleMap +}; + + static QCString getDotFontName() { static QCString dotFontName = Config_getString("DOT_FONTNAME"); @@ -314,7 +420,7 @@ static void unsetDotFontPath() static bool readBoundingBox(const char *fileName,int *width,int *height,bool isEps) { - QCString bb = isEps ? QCString("%%PageBoundingBox:") : QCString(" /MediaBox [ "); + QCString bb = isEps ? QCString("%%PageBoundingBox:") : QCString("/MediaBox ["); QFile f(fileName); if (!f.open(IO_ReadOnly|IO_Raw)) { @@ -329,10 +435,11 @@ static bool readBoundingBox(const char *fileName,int *width,int *height,bool isE if (numBytes>0) { buf[numBytes]='\0'; - if (strncmp(buf,bb.data(),bb.length()-1)==0) // found PageBoundingBox string + const char *p = strstr(buf,bb); + if (p) // found PageBoundingBox or /MediaBox string { int x,y; - if (sscanf(buf+bb.length(),"%d %d %d %d",&x,&y,width,height)!=4) + if (sscanf(p+bb.length(),"%d %d %d %d",&x,&y,width,height)!=4) { //printf("readBoundingBox sscanf fail\n"); return FALSE; @@ -346,14 +453,14 @@ static bool readBoundingBox(const char *fileName,int *width,int *height,bool isE return FALSE; } } - //printf("readBoundingBox: bounding box not found\n"); + err("Failed to extract bounding box from generated diagram file %s\n",fileName); return FALSE; } static bool writeVecGfxFigure(FTextStream &out,const QCString &baseName, const QCString &figureName) { - int width=420,height=600; + int width=400,height=550; static bool usePdfLatex = Config_getBool("USE_PDFLATEX"); if (usePdfLatex) { @@ -372,8 +479,8 @@ static bool writeVecGfxFigure(FTextStream &out,const QCString &baseName, } } //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 */ + int maxWidth = 350; /* approx. page width in points, excl. margins */ + int maxHeight = 550; /* approx. page height in points, excl. margins */ out << "\\nopagebreak\n" "\\begin{figure}[H]\n" "\\begin{center}\n" @@ -420,8 +527,16 @@ static bool readSVGSize(const QCString &fileName,int *width,int *height) if (numBytes>0) { buf[numBytes]='\0'; - if (sscanf(buf,"<svg width=\"%dpt\" height=\"%dpt\"",width,height)==2) + if (strncmp(buf,"<!--zoomable-->",15)==0) { + //printf("Found zoomable for %s!\n",fileName.data()); + *width=-1; + *height=-1; + found=TRUE; + } + else if (sscanf(buf,"<svg width=\"%dpt\" height=\"%dpt\"",width,height)==2) + { + //printf("Found fixed size %dx%d for %s!\n",*width,*height,fileName.data()); found=TRUE; } } @@ -449,14 +564,28 @@ static bool writeSVGFigureLink(FTextStream &out,const QCString &relPath, { return FALSE; } + if (width==-1 && height==-1) + { // out << "<object type=\"image/svg+xml\" data=\"" - out << "<iframe src=\"" - << relPath << baseName << ".svg\" width=\"" - << ((width*96+48)/72) << "\" height=\"" - << ((height*96+48)/72) << "\" frameborder=\"0\" scrolling=\"no\">"; + out << "<div class=\"zoom\"><iframe src=\"" + << relPath << baseName << ".svg\" width=\"100%\" height=\"600\"" + << " frameborder=\"0\" scrolling=\"no\">"; + } + else + { +// out << "<object type=\"image/svg+xml\" data=\"" + out << "<iframe src=\"" + << relPath << baseName << ".svg\" width=\"" + << ((width*96+48)/72) << "\" height=\"" + << ((height*96+48)/72) << "\" frameborder=\"0\" scrolling=\"no\">"; + } writeSVGNotSupported(out); // out << "</object>"; out << "</iframe>"; + if (width==-1 && height==-1) + { + out << "</div>"; + } return TRUE; } @@ -679,16 +808,22 @@ DotFilePatcher::DotFilePatcher(const char *patchFile) m_maps.setAutoDelete(TRUE); } +QCString DotFilePatcher::file() const +{ + return m_patchFile; +} + int DotFilePatcher::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; + map->mapFile = mapFile; + map->relPath = relPath; + map->urlOnly = urlOnly; + map->context = context; + map->label = label; + map->zoomable = FALSE; m_maps.append(map); return id; } @@ -698,21 +833,23 @@ int DotFilePatcher::addFigure(const QCString &baseName, { int id = m_maps.count(); Map *map = new Map; - map->mapFile = figureName; - map->urlOnly = heightCheck; - map->label = baseName; + map->mapFile = figureName; + map->urlOnly = heightCheck; + map->label = baseName; + map->zoomable = FALSE; m_maps.append(map); return id; } int DotFilePatcher::addSVGConversion(const QCString &relPath,bool urlOnly, - const QCString &context) + const QCString &context,bool zoomable) { int id = m_maps.count(); Map *map = new Map; - map->relPath = relPath; - map->urlOnly = urlOnly; - map->context = context; + map->relPath = relPath; + map->urlOnly = urlOnly; + map->context = context; + map->zoomable = zoomable; m_maps.append(map); return id; } @@ -723,9 +860,10 @@ int DotFilePatcher::addSVGObject(const QCString &baseName, { int id = m_maps.count(); Map *map = new Map; - map->mapFile = absImgName; - map->relPath = relPath; - map->label = baseName; + map->mapFile = absImgName; + map->relPath = relPath; + map->label = baseName; + map->zoomable = FALSE; m_maps.append(map); return id; } @@ -733,7 +871,15 @@ int DotFilePatcher::addSVGObject(const QCString &baseName, bool DotFilePatcher::run() { //printf("DotFilePatcher::run(): %s\n",m_patchFile.data()); + static bool interactiveSVG = Config_getBool("INTERACTIVE_SVG"); bool isSVGFile = m_patchFile.right(4)==".svg"; + if (isSVGFile) + { + Map *map = m_maps.at(0); // there is only one 'map' for a SVG file + interactiveSVG = interactiveSVG && map->zoomable; + //printf("DotFilePatcher::addSVGConversion: file=%s zoomable=%d\n", + // m_patchFile.data(),map->zoomable); + } QCString tmpName = m_patchFile+".tmp"; if (!QDir::current().rename(m_patchFile,tmpName)) { @@ -756,17 +902,60 @@ bool DotFilePatcher::run() } FTextStream t(&fo); const int maxLineLen=100*1024; + int lineNr=1; + int width,height; + bool insideHeader=FALSE; + bool replacedHeader=FALSE; + bool foundSize=FALSE; while (!fi.atEnd()) // foreach line { QCString line(maxLineLen); int numBytes = fi.readLine(line.data(),maxLineLen); + if (numBytes<=0) + { + break; + } + //printf("line=[%s]\n",line.stripWhiteSpace().data()); int i; ASSERT(numBytes<maxLineLen); if (isSVGFile) { - Map *map = m_maps.at(0); // there is only one 'map' for a SVG file - t << replaceRef(line,map->relPath,map->urlOnly,map->context,"_top"); + if (interactiveSVG) + { + if (line.find("<svg")!=-1 && !replacedHeader) + { + int count; + count = sscanf(line.data(),"<svg width=\"%dpt\" height=\"%dpt\"",&width,&height); + //printf("width=%d height=%d\n",width,height); + foundSize = count==2 && (width>500 || height>450); + if (foundSize) insideHeader=TRUE; + } + else if (insideHeader && !replacedHeader && line.find("<title>")!=-1) + { + if (foundSize) + { + // insert special replacement header for interactive SVGs + t << "<!--zoomable-->\n"; + t << svgZoomHeader; + t << "var viewWidth = " << width << ";\n"; + t << "var viewHeight = " << height << ";\n"; + t << "</script>\n"; + t << "<script xlink:href=\"svgpan.js\"/>\n"; + t << "<svg id=\"graph\" class=\"graph\">\n"; + t << "<g id=\"viewport\">\n"; + } + insideHeader=FALSE; + replacedHeader=TRUE; + } + } + if (!insideHeader || !foundSize) // copy SVG and replace refs, + // unless we are inside the header of the SVG. + // Then we replace it with another header. + { + Map *map = m_maps.at(0); // there is only one 'map' for a SVG file + t << replaceRef(line,map->relPath,map->urlOnly,map->context,"_top"); + } } else if ((i=line.find("<!-- SVG"))!=-1 || (i=line.find("[!-- SVG"))!=-1) { @@ -778,6 +967,8 @@ bool DotFilePatcher::run() { int e = QMAX(line.find("--]"),line.find("-->")); Map *map = m_maps.at(mapId); + //printf("DotFilePatcher::writeSVGFigure: file=%s zoomable=%d\n", + // m_patchFile.data(),map->zoomable); if (!writeSVGFigureLink(t,map->relPath,map->label,map->mapFile)) { err("Problem extracting size from SVG file %s\n",map->mapFile.data()); @@ -832,6 +1023,11 @@ bool DotFilePatcher::run() { t << line; } + lineNr++; + } + if (isSVGFile && interactiveSVG && replacedHeader) + { + t << svgZoomFooter; } fi.close(); QDir::current().remove(tmpName); @@ -970,7 +1166,7 @@ int DotManager::addFigure(const QCString &file,const QCString &baseName, } int DotManager::addSVGConversion(const QCString &file,const QCString &relPath, - bool urlOnly,const QCString &context) + bool urlOnly,const QCString &context,bool zoomable) { DotFilePatcher *map = m_dotMaps.find(file); if (map==0) @@ -978,7 +1174,7 @@ int DotManager::addSVGConversion(const QCString &file,const QCString &relPath, map = new DotFilePatcher(file); m_dotMaps.append(file,map); } - return map->addSVGConversion(relPath,urlOnly,context); + return map->addSVGConversion(relPath,urlOnly,context,zoomable); } int DotManager::addSVGObject(const QCString &file,const QCString &baseName, @@ -1069,11 +1265,27 @@ bool DotManager::run() i=1; SDict<DotFilePatcher>::Iterator di(m_dotMaps); DotFilePatcher *map; + // since patching the svg files may involve patching the header of the SVG + // (for zoomable SVGs), and patching the .html files requires reading that + // header after the SVG is patched, we first process the .svg files and + // then the other files. + for (di.toFirst();(map=di.current());++di) + { + if (map->file().right(4)==".svg") + { + msg("Patching output file %d/%d\n",i,numDotMaps); + if (!map->run()) return FALSE; + i++; + } + } for (di.toFirst();(map=di.current());++di) { - msg("Patching output file %d/%d\n",i,numDotMaps); - if (!map->run()) return FALSE; - i++; + if (map->file().right(4)!=".svg") + { + msg("Patching output file %d/%d\n",i,numDotMaps); + if (!map->run()) return FALSE; + i++; + } } return TRUE; } @@ -1249,8 +1461,11 @@ static QCString escapeTooltip(const QCString &tooltip) } #endif -static void writeBoxMemberList(FTextStream &t,char prot,MemberList *ml,ClassDef *scope) +static void writeBoxMemberList(FTextStream &t, + char prot,MemberList *ml,ClassDef *scope, + bool isStatic=FALSE) { + (void)isStatic; if (ml) { MemberListIterator mlia(*ml); @@ -1259,7 +1474,8 @@ static void writeBoxMemberList(FTextStream &t,char prot,MemberList *ml,ClassDef { if (mma->getClassDef() == scope) { - t << prot << " " << convertLabel(mma->name()); + t << prot << " "; + t << convertLabel(mma->name()); if (!mma->isObjCMethod() && (mma->isFunction() || mma->isSlot() || mma->isSignal())) t << "()"; t << "\\l"; @@ -1298,30 +1514,39 @@ void DotNode::writeBox(FTextStream &t, if (m_classDef && Config_getBool("UML_LOOK") && (gt==Inheritance || gt==Collaboration)) { + //printf("DotNode::writeBox for %s\n",m_classDef->name().data()); + static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); t << "{" << convertLabel(m_label); t << "\\n|"; writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubAttribs),m_classDef); - writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticAttribs),m_classDef); + writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticAttribs),m_classDef,TRUE); writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::properties),m_classDef); writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacAttribs),m_classDef); - writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticAttribs),m_classDef); + writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticAttribs),m_classDef,TRUE); writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proAttribs),m_classDef); - writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticAttribs),m_classDef); - writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priAttribs),m_classDef); - writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticAttribs),m_classDef); + writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticAttribs),m_classDef,TRUE); + if (extractPrivate) + { + writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priAttribs),m_classDef); + writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticAttribs),m_classDef,TRUE); + } t << "|"; writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubMethods),m_classDef); - writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticMethods),m_classDef); + writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticMethods),m_classDef,TRUE); writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubSlots),m_classDef); writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacMethods),m_classDef); - writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticMethods),m_classDef); + writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticMethods),m_classDef,TRUE); writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proMethods),m_classDef); - writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticMethods),m_classDef); + writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticMethods),m_classDef,TRUE); writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proSlots),m_classDef); - writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priMethods),m_classDef); - writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticMethods),m_classDef); - writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priSlots),m_classDef); - if (m_classDef->getMemberGroupSDict()) + if (extractPrivate) + { + writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priMethods),m_classDef); + writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticMethods),m_classDef,TRUE); + writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priSlots),m_classDef); + } + if (m_classDef->getLanguage()!=SrcLangExt_F90 && + m_classDef->getMemberGroupSDict()) { MemberGroupSDict::Iterator mgdi(*m_classDef->getMemberGroupSDict()); MemberGroup *mg; @@ -1405,22 +1630,31 @@ void DotNode::writeArrow(FTextStream &t, else t << reNumberNode(cn->number(),reNumber); t << " ["; - if (pointBack) t << "dir=back,"; - t << "color=\"" << edgeColorMap[ei->m_color] - << "\",fontsize=\"" << FONTSIZE << "\",style=\"" << edgeStyleMap[ei->m_style] << "\""; + + static bool umlLook = Config_getBool("UML_LOOK"); + const EdgeProperties *eProps = umlLook ? ¨EdgeProps : &normalEdgeProps; + QCString aStyle = eProps->arrowStyleMap[ei->m_color]; + bool umlUseArrow = aStyle=="odiamond"; + + if (pointBack && !umlUseArrow) t << "dir=\"back\","; + t << "color=\"" << eProps->edgeColorMap[ei->m_color] + << "\",fontsize=\"" << FONTSIZE << "\","; + t << "style=\"" << eProps->edgeStyleMap[ei->m_style] << "\""; if (!ei->m_label.isEmpty()) { - t << ",label=\"" << convertLabel(ei->m_label) << "\""; + t << ",label=\" " << convertLabel(ei->m_label) << "\" "; } - if (Config_getBool("UML_LOOK") && - arrowStyle[ei->m_color] && + if (umlLook && + eProps->arrowStyleMap[ei->m_color] && (gt==Inheritance || gt==Collaboration) ) { - if (pointBack) - t << ",arrowtail=\"" << arrowStyle[ei->m_color] << "\""; + bool rev = pointBack; + if (umlUseArrow) rev=!rev; // UML use relates has arrow on the start side + if (rev) + t << ",arrowtail=\"" << eProps->arrowStyleMap[ei->m_color] << "\""; else - t << ",arrowhead=\"" << arrowStyle[ei->m_color] << "\""; + t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->m_color] << "\""; } if (format==BITMAP) t << ",fontname=\"" << FONTNAME << "\""; @@ -1759,7 +1993,7 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out, QGString theGraph; FTextStream md5stream(&theGraph); writeGraphHeader(md5stream); - md5stream << " rankdir=LR;" << endl; + md5stream << " rankdir=\"LR\";" << endl; for (dnli2.toFirst();(node=dnli2.current());++dnli2) { if (node->m_subgraphId==n->m_subgraphId) @@ -1814,7 +2048,7 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out, if (regenerate) { DotManager::instance()->addSVGConversion(absImgName,QCString(), - FALSE,QCString()); + FALSE,QCString(),FALSE); } int mapId = DotManager::instance()->addSVGObject(fileName,baseName, absImgName,QCString()); @@ -2432,7 +2666,7 @@ QCString computeMd5Signature(DotNode *root, writeGraphHeader(md5stream); if (lrRank) { - md5stream << " rankdir=LR;" << endl; + md5stream << " rankdir=\"LR\";" << endl; } root->clearWriteFlag(); root->write(md5stream, @@ -2624,7 +2858,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, { if (regenerate) { - DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString()); + DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString(),TRUE); } int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath); out << "<!-- SVG " << mapId << " -->" << endl; @@ -2940,7 +3174,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, { if (regenerate) { - DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString()); + DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString(),TRUE); } int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath); out << "<!-- SVG " << mapId << " -->" << endl; @@ -3230,7 +3464,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, { if (regenerate) { - DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString()); + DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString(),TRUE); } int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath); out << "<!-- SVG " << mapId << " -->" << endl; @@ -3374,7 +3608,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, { if (regenerate) { - DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString()); + DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString(),TRUE); } int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath); out << "<!-- SVG " << mapId << " -->" << endl; @@ -3431,21 +3665,21 @@ void generateGraphLegend(const char *path) 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 -> 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 -> 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 -> 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 -> 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 -> 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 -> 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 -> 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 -> 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]; @@ -3573,7 +3807,7 @@ void writeDotImageMapFromFile(FTextStream &t, { writeSVGFigureLink(t,relPath,inFile,inFile+".svg"); DotFilePatcher patcher(inFile+".svg"); - patcher.addSVGConversion(relPath,TRUE,context); + patcher.addSVGConversion(relPath,TRUE,context,TRUE); patcher.run(); } else // bitmap graphics @@ -3913,7 +4147,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo { if (regenerate) { - DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString()); + DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString(),TRUE); } int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath); t << "<!-- SVG " << mapId << " -->" << endl; @@ -3951,7 +4185,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo void DotGroupCollaboration::Edge::write( FTextStream &t ) const { const char* linkTypeColor[] = { - "darkorchid3" + "darkorchid3" ,"orange" ,"blueviolet" ,"darkgreen" @@ -367,16 +367,18 @@ class DotFilePatcher bool urlOnly; QCString context; QCString label; + bool zoomable; }; 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); + int addSVGConversion(const QCString &relPath,bool urlOnly,const QCString &context,bool zoomable); int addSVGObject(const QCString &baseName, const QCString &figureName, const QCString &relPath); bool run(); + QCString file() const; private: QList<Map> m_maps; @@ -419,7 +421,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 urlOnly,const QCString &context,bool zoomable); int addSVGObject(const QCString &file,const QCString &baseName, const QCString &figureNAme,const QCString &relPath); bool run(); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index a451e46..e65871b 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -3764,7 +3764,7 @@ static void findUsedClassesForClass(EntryNav *rootNav, } //printf(" template substitution gives=%s\n",type.data()); - while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1) + while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec,rootNav->lang())!=-1) { // find the type (if any) that matches usedClassName ClassDef *typeCd = getResolvedClass(masterCd, @@ -3828,8 +3828,8 @@ static void findUsedClassesForClass(EntryNav *rootNav, { if (isArtificial) usedCd->setArtificial(TRUE); Debug::print(Debug::Classes,0," Adding used class `%s' (1)\n", usedCd->name().data()); - instanceCd->addUsedClass(usedCd,md->name()); - usedCd->addUsedByClass(instanceCd,md->name()); + instanceCd->addUsedClass(usedCd,md->name(),md->protection()); + usedCd->addUsedByClass(instanceCd,md->name(),md->protection()); } } } @@ -3845,8 +3845,8 @@ static void findUsedClassesForClass(EntryNav *rootNav, { found=TRUE; Debug::print(Debug::Classes,0," Adding used class `%s' (2)\n", usedCd->name().data()); - instanceCd->addUsedClass(usedCd,md->name()); // class exists - usedCd->addUsedByClass(instanceCd,md->name()); + instanceCd->addUsedClass(usedCd,md->name(),md->protection()); // class exists + usedCd->addUsedByClass(instanceCd,md->name(),md->protection()); } } if (delTempNames) @@ -3875,8 +3875,8 @@ static void findUsedClassesForClass(EntryNav *rootNav, { if (isArtificial) usedCd->setArtificial(TRUE); Debug::print(Debug::Classes,0," Adding used class `%s' (3)\n", usedCd->name().data()); - instanceCd->addUsedClass(usedCd,md->name()); - usedCd->addUsedByClass(instanceCd,md->name()); + instanceCd->addUsedClass(usedCd,md->name(),md->protection()); + usedCd->addUsedByClass(instanceCd,md->name(),md->protection()); } } } diff --git a/src/doxygen.css b/src/doxygen.css index 4b50f0d..51aa196 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -72,8 +72,6 @@ div.qindex, div.navtab{ background-color: ##ee; border: 1px solid ##b0; text-align: center; - margin: 2px; - padding: 2px; } div.qindex, div.navpath { @@ -190,8 +188,8 @@ body { div.contents { margin-top: 10px; - margin-left: 10px; - margin-right: 5px; + margin-left: 8px; + margin-right: 8px; } td.indexkey { @@ -414,7 +412,7 @@ table.memberdecls { margin-left: 6px; } -.memproto { +.memproto, dl.reflist dt { border-top: 1px solid ##B4; border-left: 1px solid ##B4; border-right: 1px solid ##B4; @@ -440,7 +438,7 @@ table.memberdecls { } -.memdoc { +.memdoc, dl.reflist dd { border-bottom: 1px solid ##B4; border-left: 1px solid ##B4; border-right: 1px solid ##B4; @@ -463,6 +461,15 @@ table.memberdecls { 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)); } +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + .paramkey { text-align: right; } @@ -701,6 +708,7 @@ div.summary a div.ingroups { + margin-left: 5px; font-size: 8pt; padding-left: 5px; width: 50%; @@ -723,7 +731,7 @@ div.header div.headertitle { - padding: 5px 5px 5px 10px; + padding: 5px 5px 5px 7px; } dl @@ -833,3 +841,8 @@ dl.bug font-weight: bold; } +div.zoom +{ + border: 1px solid ##A0; +} + diff --git a/src/doxygen_css.h b/src/doxygen_css.h index b0ec3de..9e44733 100644 --- a/src/doxygen_css.h +++ b/src/doxygen_css.h @@ -72,8 +72,6 @@ " background-color: ##ee;\n" " border: 1px solid ##b0;\n" " text-align: center;\n" -" margin: 2px;\n" -" padding: 2px;\n" "}\n" "\n" "div.qindex, div.navpath {\n" @@ -190,8 +188,8 @@ "\n" "div.contents {\n" " margin-top: 10px;\n" -" margin-left: 10px;\n" -" margin-right: 5px;\n" +" margin-left: 8px;\n" +" margin-right: 8px;\n" "}\n" "\n" "td.indexkey {\n" @@ -414,7 +412,7 @@ " margin-left: 6px;\n" "}\n" "\n" -".memproto {\n" +".memproto, dl.reflist dt {\n" " border-top: 1px solid ##B4;\n" " border-left: 1px solid ##B4;\n" " border-right: 1px solid ##B4;\n" @@ -440,7 +438,7 @@ "\n" "}\n" "\n" -".memdoc {\n" +".memdoc, dl.reflist dd {\n" " border-bottom: 1px solid ##B4; \n" " border-left: 1px solid ##B4; \n" " border-right: 1px solid ##B4; \n" @@ -463,6 +461,15 @@ " 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" +"dl.reflist dt {\n" +" padding: 5px;\n" +"}\n" +"\n" +"dl.reflist dd {\n" +" margin: 0px 0px 10px 0px;\n" +" padding: 5px;\n" +"}\n" +"\n" ".paramkey {\n" " text-align: right;\n" "}\n" @@ -701,6 +708,7 @@ "\n" "div.ingroups\n" "{\n" +" margin-left: 5px;\n" " font-size: 8pt;\n" " padding-left: 5px;\n" " width: 50%;\n" @@ -723,7 +731,7 @@ "\n" "div.headertitle\n" "{\n" -" padding: 5px 5px 5px 10px;\n" +" padding: 5px 5px 5px 7px;\n" "}\n" "\n" "dl\n" @@ -833,3 +841,8 @@ " font-weight: bold;\n" "}\n" "\n" +"div.zoom\n" +"{\n" +" border: 1px solid ##A0;\n" +"}\n" +"\n" diff --git a/src/entry.h b/src/entry.h index 6f1e2e4..ddb2017 100644 --- a/src/entry.h +++ b/src/entry.h @@ -239,28 +239,31 @@ class Entry }; enum MemberSpecifier { - Inline = 0x000001, - Explicit = 0x000002, - Mutable = 0x000004, - Settable = 0x000008, - Gettable = 0x000010, - Readable = 0x000020, - Writable = 0x000040, - Final = 0x000080, - Abstract = 0x000100, - Addable = 0x000200, - Removable = 0x000400, - Raisable = 0x000800, - Override = 0x001000, - New = 0x002000, - Sealed = 0x004000, - Initonly = 0x008000, - Optional = 0x010000, - Required = 0x020000, - NonAtomic = 0x040000, - Copy = 0x080000, - Retain = 0x100000, - Assign = 0x200000 + Inline = 0x00000001, + Explicit = 0x00000002, + Mutable = 0x00000004, + Settable = 0x00000008, + Gettable = 0x00000010, + Readable = 0x00000020, + Writable = 0x00000040, + Final = 0x00000080, + Abstract = 0x00000100, + Addable = 0x00000200, + Removable = 0x00000400, + Raisable = 0x00000800, + Override = 0x00001000, + New = 0x00002000, + Sealed = 0x00004000, + Initonly = 0x00008000, + Optional = 0x00010000, + Required = 0x00020000, + NonAtomic = 0x00040000, + Copy = 0x00080000, + Retain = 0x00100000, + Assign = 0x00200000, + Composition = 0x00400000, + Aggregation = 0x00800000, + Association = 0x01000000 }; enum ClassSpecifier { diff --git a/src/fortranscanner.l b/src/fortranscanner.l index c53a723..c189bbc 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -169,6 +169,8 @@ static int initializerArrayScope; // number if nested array scope static int initializerScope; // number if nested function calls in initializer static QCString useModuleName; // name of module in the use statement static Protection defaultProtection; +static Protection typeProtection; +static int typeMode = false; static InterfaceType ifType = IF_NONE; static char stringStartSymbol; // single or double quote @@ -519,8 +521,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA /*------- access specification --------------------------------------------------------------------------*/ -<ModuleBody>private/{BS}(\n|"!") { defaultProtection = Private; } -<ModuleBody>public/{BS}(\n|"!") { defaultProtection = Public; } +<ModuleBody>private/{BS}(\n|"!") { defaultProtection = Private; + current->protection = defaultProtection ; + } +<ModuleBody>public/{BS}(\n|"!") { defaultProtection = Public; + current->protection = defaultProtection ; + } /*------- type definition -------------------------------------------------------------------------------*/ @@ -533,6 +539,8 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA yy_push_state(Typedef); current->protection = defaultProtection; + typeProtection = defaultProtection; + typeMode = true; } <Typedef>{ {COMMA} {} @@ -548,9 +556,11 @@ extends{ARGS} { } public { current->protection = Public; + typeProtection = Public; } private { current->protection = Private; + typeProtection = Private; } {LANGUAGE_BIND_SPEC} { /* ignored for now */ @@ -618,6 +628,7 @@ private { ^{BS}"end"{BS}"type"({BS_}{ID})?{BS}/(\n|!) { /* end type definition */ if (!endScope(current_root)) yyterminate(); + typeMode = false; yy_pop_state(); } } @@ -683,6 +694,7 @@ private { } {ID} { } +^{BS}"type"{BS_}"is" { } } <AttributeList>{ {COMMA} {} @@ -782,6 +794,13 @@ private { inputStringSemi =(const char*)(yytext+1); pushBuffer(inputStringSemi); } +<*>";".*"\n" { + if (YY_START == Variable) REJECT; // Just be on the safe side + if (YY_START == String) REJECT; // ";" ignored in strings + if (YY_START == StrIgnore) REJECT; // ";" ignored in regular comments + inputStringSemi =(const char*)(yytext+1); + pushBuffer(inputStringSemi); + } <Initialization,ArrayInitializer>"(/" { initializer+=yytext; initializerArrayScope++; @@ -1225,22 +1244,29 @@ static const char* prepassFixedForm(const char* contents) case 'C': case 'c': case '*': - emptyLabel=FALSE; - if(column==1) - newContents[j]='!'; - else - newContents[j]=c; - break; + if (column!=6) + { + emptyLabel=FALSE; + if(column==1) + newContents[j]='!'; + else + newContents[j]=c; + break; + } default: if(column==6 && emptyLabel) { // continuation - newContents[j]=' '; - - if(prevLineAmpOrExclIndex==-1) { // add & just before end of previous line - insertCharacter(newContents, j+1, (j+1)-6-1, '&'); - j++; - } else { // add & just before end of previous line comment - insertCharacter(newContents, j+1, (j+1)-6-prevLineLength+prevLineAmpOrExclIndex, '&'); - j++; + if (c != '0') { // 0 not allowed as continuatioin character, see f95 standard paragraph 3.3.2.3 + newContents[j]=' '; + + if(prevLineAmpOrExclIndex==-1) { // add & just before end of previous line + insertCharacter(newContents, j+1, (j+1)-6-1, '&'); + j++; + } else { // add & just before end of previous line comment + insertCharacter(newContents, j+1, (j+1)-6-prevLineLength+prevLineAmpOrExclIndex, '&'); + j++; + } + } else { + newContents[j]=c; // , just handle like space } } else { newContents[j]=c; @@ -1730,7 +1756,14 @@ static void initParser() static void initEntry() { - current->protection = defaultProtection ; + if (typeMode) + { + current->protection = typeProtection; + } + else + { + current->protection = defaultProtection; + } current->mtype = mtype; current->virt = virt; current->stat = gstat; @@ -1757,7 +1790,7 @@ static void addModule(const char *name, bool isModule) //fprintf(stderr, "0=========> got module %s\n", name); if (isModule) - current->section = Entry::NAMESPACE_SEC; + current->section = Entry::CLASS_SEC; else current->section = Entry::FUNCTION_SEC; diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index b86a85b..7231ddc 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -43,18 +43,6 @@ static const char resize_script[]= #include "resize_js.h" ; -#if 0 -static const char jquery_script1[]= -#include "jquery_js.h" -; -static const char jquery_script2[]= -#include "sizzle_js.h" -; -static const char jquery_script3[]= -#include "jquery_ui_js.h" -; -#endif - static const char navtree_css[]= #include "navtree_css.h" ; diff --git a/src/groupdef.cpp b/src/groupdef.cpp index f4d4eb9..0ac582b 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -235,15 +235,20 @@ bool GroupDef::insertMember(MemberDef *md,bool docOnly) (srcMd->getOuterScope()->definitionType()==Definition::TypeFile && md->getOuterScope()->definitionType()==Definition::TypeFile); - LockingPtr<ArgumentList> srcMdAl = srcMd->argumentList(); - LockingPtr<ArgumentList> mdAl = md->argumentList(); + LockingPtr<ArgumentList> srcMdAl = srcMd->argumentList(); + LockingPtr<ArgumentList> mdAl = md->argumentList(); + LockingPtr<ArgumentList> tSrcMdAl = srcMd->templateArguments(); + LockingPtr<ArgumentList> tMdAl = md->templateArguments(); - if (srcMd->isFunction() && md->isFunction() && + if (srcMd->isFunction() && md->isFunction() && // both are a function + (tSrcMdAl.pointer()==0 && tMdAl.pointer()==0 || + (tSrcMdAl.pointer()!=0 && tMdAl.pointer()!=0 && tSrcMdAl->count()==tMdAl->count()) + ) && // same number of template arguments matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl.pointer(), md->getOuterScope(),md->getFileDef(),mdAl.pointer(), TRUE - ) && - sameScope + ) && // matching parameters + sameScope // both are found in the same scope ) { if (srcMd->getGroupAlias()==0) diff --git a/src/htmlattrib.h b/src/htmlattrib.h index 531f29a..b25489c 100644 --- a/src/htmlattrib.h +++ b/src/htmlattrib.h @@ -35,6 +35,18 @@ class HtmlAttribList : public QList<HtmlAttrib> { operator=(l); } HtmlAttribList &operator=(const HtmlAttribList &l) { clear(); QList<HtmlAttrib>::operator=(l); return *this; } + QCString find(const QCString name) const + { + HtmlAttribList *that = (HtmlAttribList *)this; + QCString result; + HtmlAttrib *attr=that->first(); + while (attr) + { + if (attr->name==name) return attr->value; + attr=that->next(); + } + return result; + } QCString toString() const { HtmlAttribList *that = (HtmlAttribList *)this; diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 7fe32bf..d9cd52f 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -912,6 +912,8 @@ void HtmlDocVisitor::visitPre(DocSimpleSect *s) m_t << theTranslator->trPrecondition(); break; case DocSimpleSect::Post: m_t << theTranslator->trPostcondition(); break; + case DocSimpleSect::Copyright: + m_t << "Copyright" /* TODO: theTranslator->trCopyright() */; break; case DocSimpleSect::Invar: m_t << theTranslator->trInvariant(); break; case DocSimpleSect::Remark: diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index f4e9c54..d62fffa 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -60,13 +60,19 @@ static const char search_styleSheet[] = static const char search_jquery_script1[]= #include "jquery_js.h" ; + static const char search_jquery_script2[]= #include "sizzle_js.h" ; + static const char search_jquery_script3[]= #include "jquery_ui_js.h" ; +static const char svgpan_script[]= +#include "svgpan_js.h" +; + static QCString g_header; static QCString g_footer; @@ -1093,6 +1099,16 @@ void HtmlGenerator::init() t << search_jquery_script1 << search_jquery_script2 << search_jquery_script3; } } + + if (Config_getBool("INTERACTIVE_SVG")) + { + QFile f(dname+"/svgpan.js"); + if (f.open(IO_WriteOnly)) + { + FTextStream t(&f); + t << svgpan_script; + } + } } /// Additional initialization after indices have been created @@ -2763,13 +2779,15 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath, { if (!serverBasedSearch) // pure client side search { - t << " <li id=\"searchli\">\n"; + //t << " <li id=\"searchli\">\n"; + t << " <li>\n"; writeClientSearchBox(t,relPath); t << " </li>\n"; } else // if (!generateTreeView) // server based search { - t << " <li id=\"searchli\">\n"; + //t << " <li id=\"searchli\">\n"; + t << " <li>\n"; writeServerSearchBox(t,relPath,highlightSearch); if (!highlightSearch) { diff --git a/src/lang_cfg.h b/src/lang_cfg.h index 99be35e..72305af 100644 --- a/src/lang_cfg.h +++ b/src/lang_cfg.h @@ -37,3 +37,4 @@ #define LANG_VI #define LANG_TR #define LANG_EO +#define LANG_AM diff --git a/src/language.cpp b/src/language.cpp index 1264bdd..a07c5e4 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -26,6 +26,9 @@ #ifdef LANG_NL #include "translator_nl.h" #endif +#ifdef LANG_AM +#include "translator_am.h" +#endif #ifdef LANG_SV #include "translator_sv.h" #endif @@ -172,6 +175,12 @@ bool setTranslator(const char *langName) theTranslator=new TranslatorDutch; } #endif +#ifdef LANG_AM + else if (L_EQUAL("amerenian")) + { + theTranslator=new TranslatorArmenian; + } +#endif #ifdef LANG_SV else if (L_EQUAL("swedish")) { diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 6d53f37..7885d82 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -393,11 +393,11 @@ void LatexDocVisitor::visit(DocVerbatim *s) void LatexDocVisitor::visit(DocAnchor *anc) { if (m_hide) return; - m_t << "\\label{" << anc->file() << "_" << anc->anchor() << "}" << endl; + m_t << "\\label{" << anc->file() << "_" << anc->anchor() << "}%" << endl; if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS")) { m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor() - << "}{}" << endl; + << "}{}%" << endl; } } @@ -601,6 +601,10 @@ void LatexDocVisitor::visitPre(DocSimpleSect *s) m_t << "\\begin{DoxyPostcond}{"; filter(theTranslator->trPostcondition()); break; + case DocSimpleSect::Copyright: + m_t << "\\begin{DoxyCopyright}{"; + filter("Copyright" /*TODO: theTranslator->trCopyright()*/); + break; case DocSimpleSect::Invar: m_t << "\\begin{DoxyInvariant}{"; filter(theTranslator->trInvariant()); @@ -671,6 +675,9 @@ void LatexDocVisitor::visitPost(DocSimpleSect *s) case DocSimpleSect::Post: m_t << "\n\\end{DoxyPostcond}\n"; break; + case DocSimpleSect::Copyright: + m_t << "\n\\end{DoxyCopyright}\n"; + break; case DocSimpleSect::Invar: m_t << "\n\\end{DoxyInvariant}\n"; break; @@ -780,16 +787,32 @@ void LatexDocVisitor::visitPost(DocHtmlListItem *) // m_t << "\\end{alltt}\\normalsize " << endl; //} -void LatexDocVisitor::visitPre(DocHtmlDescList *) +void LatexDocVisitor::visitPre(DocHtmlDescList *dl) { if (m_hide) return; - m_t << "\n\\begin{DoxyDescription}"; + QCString val = dl->attribs().find("class"); + if (val=="reflist") + { + m_t << "\n\\begin{DoxyRefList}"; + } + else + { + m_t << "\n\\begin{DoxyDescription}"; + } } -void LatexDocVisitor::visitPost(DocHtmlDescList *) +void LatexDocVisitor::visitPost(DocHtmlDescList *dl) { if (m_hide) return; - m_t << "\n\\end{DoxyDescription}"; + QCString val = dl->attribs().find("class"); + if (val=="reflist") + { + m_t << "\n\\end{DoxyRefList}"; + } + else + { + m_t << "\n\\end{DoxyDescription}"; + } } void LatexDocVisitor::visitPre(DocHtmlDescTitle *) diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 3e301ac..000fc1f 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -325,6 +325,7 @@ 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" @@ -418,10 +419,32 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) t << "\\fancyfoot[RO]{\\fancyplain{}{}}\n"; t << "%---------- Internal commands used in this style file ----------------\n\n"; + + t << "\\newcommand\\tabfill[1]{%\n"; + t << " \\dimen@\\linewidth%\n"; + t << " \\advance\\dimen@\\@totalleftmargin%\n"; + t << " \\advance\\dimen@-\\dimen\\@curtab%\n"; + t << " \\parbox[t]\\dimen@{\\raggedright #1\\ifhmode\\strut\\fi}%\n"; + t << "}\n\n"; + + t << "\\newcommand{\\ensurespace}[1]{%\n"; + t << " \\begingroup\n"; + t << " \\setlength{\\dimen@}{#1}%\n"; + t << " \\vskip\\z@\\@plus\\dimen@\n"; + t << " \\penalty -100\\vskip\\z@\\@plus -\\dimen@\n"; + t << " \\vskip\\dimen@\n"; + t << " \\penalty 9999%\n"; + t << " \\vskip -\\dimen@\n"; + t << " \\vskip\\z@skip % hide the previous |\\vskip| from |\\addvspace|\n"; + t << " \\endgroup\n"; + t << "}\n\n"; + t << "% Generic environment used by all paragraph-based environments defined\n" "% below. Note that the command \\title{...} needs to be defined inside\n" "% those environments!\n" "\\newenvironment{DoxyDesc}[1]{%\n" + //" \\filbreak%\n" + " \\ensurespace{4\\baselineskip}%\n" " \\begin{list}{}%\n" " {%\n" " \\settowidth{\\labelwidth}{40pt}%\n" @@ -559,6 +582,12 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) "}{%\n" " \\end{DoxyDesc}%\n" "}\n\n"; + t << "% Used by @copyright\n" + "\\newenvironment{DoxyCopyright}[1]{%\n" + " \\begin{DoxyDesc}{#1}%\n" + "}{%\n" + " \\end{DoxyDesc}%\n" + "}\n\n"; t << "% Used by @remark\n" "\\newenvironment{DoxyRemark}[1]{%\n" " \\begin{DoxyDesc}{#1}%\n" @@ -652,9 +681,9 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) " \\begin{DoxyDesc}{#1}%\n" " \\begin{description}%\n" " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n" - " \\definecolor{tableShade}{HTML}{F8F8F8}%\n" - " \\rowcolors{1}{white}{tableShade}%\n" - " \\arrayrulecolor{gray}%\n" + //" \\definecolor{tableShade}{HTML}{F8F8F8}%\n" + //" \\rowcolors{1}{white}{tableShade}%\n" + //" \\arrayrulecolor{gray}%\n" " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n" " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n" " p{0.77\\textwidth}|}%\n" @@ -740,6 +769,29 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) t << "}\n"; t << "{\\end{list}}\n"; + t << "\\newsavebox{\\xrefbox}\n"; + t << "\\newlength{\\xreflength}\n"; + t << "\\newcommand{\\xreflabel}[1]{%\n"; + t << " \\sbox{\\xrefbox}{#1}%\n"; + t << " \\settoboxwidth{\\xreflength}{\\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 << " \\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{\\leftmargin}{\\labelwidth}%\n"; + t << " \\addtolength{\\leftmargin}{\\labelsep}%\n"; + t << " \\renewcommand{\\makelabel}{\\xreflabel}%\n"; + t << " }%\n"; + t << " }%\n"; + t << "{\\end{list}}\n"; + t << "\\newenvironment{Indent}\n"; t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n"; t << " \\item[]\\ignorespaces}\n"; @@ -1082,7 +1134,7 @@ void LatexGenerator::endIndexSection(IndexSections is) if (!gd->isReference()) { //if (compactLatex) t << "\\input"; else t << "\\include"; - t << "\\input"; + t << "\\include"; t << "{" << gd->getOutputFileBase() << "}\n"; } } diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index 2aa0a78..f04ba7c 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -64,6 +64,7 @@ HEADERS = bufstr.h \ jquery_js.h \ jquery_ui_js.h \ sizzle_js.h \ + svgpan_js.h \ language.h \ latexdocvisitor.h \ latexgen.h \ @@ -116,6 +117,7 @@ HEADERS = bufstr.h \ textdocvisitor.h \ translator.h \ translator_adapter.h \ + translator_am.h \ translator_br.h \ translator_ca.h \ translator_cn.h \ diff --git a/src/libdoxygen.t b/src/libdoxygen.t index b603380..ca34a08 100644 --- a/src/libdoxygen.t +++ b/src/libdoxygen.t @@ -143,3 +143,6 @@ sizzle_js.h: sizzle.js navtree_css.h: navtree.css cat navtree.css | $(TO_C_CMD) >navtree_css.h +svgpan_js.h: svgpan.js + cat svgpan.js | $(TO_C_CMD) >svgpan_js.h + diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 90780e1..48109af 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -445,6 +445,8 @@ void ManDocVisitor::visitPre(DocSimpleSect *s) m_t << theTranslator->trPrecondition(); break; case DocSimpleSect::Post: m_t << theTranslator->trPostcondition(); break; + case DocSimpleSect::Copyright: + m_t << "Copyright" /*theTranslator->trCopyright()*/; break; case DocSimpleSect::Invar: m_t << theTranslator->trInvariant(); break; case DocSimpleSect::Remark: diff --git a/src/memberdef.cpp b/src/memberdef.cpp index f4139d2..bd23b23 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -16,6 +16,7 @@ */ #include <stdio.h> +#include <qglobal.h> #include <qregexp.h> #include <assert.h> #include "md5.h" @@ -44,6 +45,11 @@ #define START_MARKER 0x4D454D5B // MEM[ #define END_MARKER 0x4D454D5D // MEM] +#if defined(_OS_WIN32_) +#define snprintf _snprintf +#endif + + //----------------------------------------------------------------------------- int MemberDef::s_indentLevel = 0; @@ -1011,7 +1017,7 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *, { if (isStatic()) ol.docify("+ "); else ol.docify("- "); } - if (!onlyText) // write link + if (!onlyText && isLinkable()) // write link { if (m_impl->mtype==EnumValue && getGroupDef()==0 && // enum value is not grouped getEnumScope() && getEnumScope()->getGroupDef()) // but its container is @@ -2622,14 +2628,26 @@ void MemberDef::setAnchor(const char *a) QCString memAnchor = name(); if (!m_impl->args.isEmpty()) memAnchor+=m_impl->args; - // include definition as well, to distinguish between two template + memAnchor.prepend(definition()); // actually the method name is now included + // twice, which is silly, but we keep it this way for backward + // compatibility. + + // include number of template arguments as well, + // to distinguish between two template // specializations that only differ in the template parameters. - memAnchor.prepend(definition()); + if (m_impl->tArgList) + { + char buf[20]; + snprintf(buf,20,"%d:",m_impl->tArgList->count()); + buf[19]='\0'; + memAnchor.prepend(buf); + } // convert to md5 hash uchar md5_sig[16]; QCString sigStr(33); MD5Buffer((const unsigned char *)memAnchor.data(),memAnchor.length(),md5_sig); + //printf("memAnchor=%s\n",memAnchor.data()); MD5SigToString(md5_sig,sigStr.data(),33); m_impl->anc = "a"+sigStr; } diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 3265d67..69ff314 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -808,6 +808,7 @@ void PerlModDocVisitor::visitPre(DocSimpleSect *s) case DocSimpleSect::Warning: type = "warning"; break; case DocSimpleSect::Pre: type = "pre"; break; case DocSimpleSect::Post: type = "post"; break; + case DocSimpleSect::Copyright: type = "copyright"; break; case DocSimpleSect::Invar: type = "invariant"; break; case DocSimpleSect::Remark: type = "remark"; break; case DocSimpleSect::Attention: type = "attention"; break; @@ -2136,7 +2136,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) <SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n { g_condCtx = YY_START; outputArray(yytext,yyleng); - BEGIN(CondLine); } <CondLine>. { unput(*yytext); diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 59f3655..33b2e60 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -289,6 +289,7 @@ class PrintDocVisitor : public DocVisitor case DocSimpleSect::Warning: printf("warning"); break; case DocSimpleSect::Pre: printf("pre"); break; case DocSimpleSect::Post: printf("post"); break; + case DocSimpleSect::Copyright: printf("copyright"); break; case DocSimpleSect::Invar: printf("invar"); break; case DocSimpleSect::Remark: printf("remark"); break; case DocSimpleSect::Attention: printf("attention"); break; diff --git a/src/reflist.cpp b/src/reflist.cpp index b06013c..cd19d53 100644 --- a/src/reflist.cpp +++ b/src/reflist.cpp @@ -19,6 +19,7 @@ #include <stdio.h> #include "reflist.h" #include "util.h" +#include "ftextstream.h" /*! Create a list of items that are cross referenced with documentation blocks * @param listName String representing the name of the list. @@ -128,26 +129,33 @@ void RefList::insertIntoList(const char *key,RefItem *item) } } + void RefList::generatePage() { if (m_itemList==0) return; m_itemList->sort(); SDict<RefItem>::Iterator it(*m_itemList); RefItem *item; + QCString doc; + doc += "<dl class=\"reflist\">"; for (it.toFirst();(item=it.current());++it) { - QCString doc; - doc = "\\anchor "; + doc += " <dt>"; + doc += "\\anchor "; doc += item->listAnchor; - doc += " <dl><dt>"; + doc += "\n"; doc += item->prefix; doc += " \\_internalref "; doc += item->name; doc += " \""; doc += item->title; - doc += "\""; - if (!item->args.isEmpty()) doc += item->args; - doc += "</dt>\n<dd>"; + doc += "\" "; + // write declaration in case a function with arguments + if (!item->args.isEmpty()) + { + doc += item->args; + } + doc += "</dt><dd> "; doc += item->text; QListIterator<RefItem> li(item->extraItems); RefItem *extraItem; @@ -155,8 +163,9 @@ void RefList::generatePage() { doc += "<p>" + extraItem->text; } - doc += "</dd></dl>\n"; - addRelatedPage(m_listName,m_pageTitle,doc,0,m_listName,1,0,0,0); + doc += "</dd>"; } + doc += "</dl>\n"; + addRelatedPage(m_listName,m_pageTitle,doc,0,m_listName,1,0,0,0); } diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index cee9828..6a70532 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -663,6 +663,8 @@ void RTFDocVisitor::visitPre(DocSimpleSect *s) m_t << theTranslator->trPrecondition(); break; case DocSimpleSect::Post: m_t << theTranslator->trPostcondition(); break; + case DocSimpleSect::Copyright: + m_t << "Copyright"; /* TODO: theTranslator->trCopyright();*/ break; case DocSimpleSect::Invar: m_t << theTranslator->trInvariant(); break; case DocSimpleSect::Remark: diff --git a/src/scanner.l b/src/scanner.l index 122cd05..7ebc0d8 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -2247,10 +2247,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } } <FindMembers>[*&]+ { - if (current->type.stripWhiteSpace().right(1)!=yytext) - { - current->name += yytext ; - } + current->name += yytext ; addType( current ); } <FindMembers,MemberSpec,Function,NextSemi,BitFields,ReadInitializer,OldStyleArgs>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" { @@ -4258,7 +4255,11 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) lastCurlyContext = FindMembers; if ( *yytext == ',' ) { - current->type = previous->type.data(); + current->type = previous->type; + // we need to strip any trailing * and & (see bugs 623023 and 649103 for test cases) + int i=current->type.length(); + while (i>0 && (current->type[i-1]=='*' || current->type[i-1]=='&' || current->type[i-1]==' ')) i--; + current->type = current->type.left(i); } if ( *yytext == '{' ) { diff --git a/src/search.css b/src/search.css index fe731e8..cc71eb9 100644 --- a/src/search.css +++ b/src/search.css @@ -4,13 +4,6 @@ float: left; } -#searchli { - float: right; - display: block; - width: 170px; - height: 36px; -} - #MSearchBox { white-space : nowrap; position: absolute; diff --git a/src/search_css.h b/src/search_css.h index 0ef3863..74e1598 100644 --- a/src/search_css.h +++ b/src/search_css.h @@ -4,13 +4,6 @@ " float: left;\n" "}\n" "\n" -"#searchli {\n" -" float: right;\n" -" display: block;\n" -" width: 170px;\n" -" height: 36px;\n" -"}\n" -"\n" "#MSearchBox {\n" " white-space : nowrap;\n" " position: absolute;\n" diff --git a/src/svgpan.js b/src/svgpan.js new file mode 100644 index 0000000..2f75255 --- /dev/null +++ b/src/svgpan.js @@ -0,0 +1,271 @@ +/** + * The code below is based on SVGPan Library 1.2 and was modified for doxygen + * + * This code is licensed under the following BSD license: + * + * Copyright 2009-2010 Andrea Leofreddi <a.leofreddi@itcharm.com>. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Andrea Leofreddi. + */ + +var root = document.documentElement; +var state = 'none'; +var stateOrigin; +var stateTf = root.createSVGMatrix(); +var cursorGrab = ' url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRFAAAA////////c3ilYwAAAAN0Uk5T//8A18oNQQAAAD1JREFUeNp0zlEKACAIA9Bt9z90bZBZkQj29qFBEuBOzQHSnWTTyckEfqUuZgFvslH4ch3qLCO/Kr8cAgwATw4Ax6XRCcoAAAAASUVORK5CYII="), move'; +var zoomSteps = 10; +var zoomInFactor; +var zoomOutFactor; +var windowWidth; +var windowHeight; +var svgDoc; +var minZoom; +var maxZoom; +if (!window) window=this; + +/** + * Register handlers + */ +function init(evt) +{ + svgDoc = evt.target.ownerDocument; + if (window.innerHeight) // Firefox + { + windowWidth = window.innerWidth; + windowHeight = window.innerHeight; + } + else if (document.documentElement.clientWidth) // Chrome/Safari + { + windowWidth = document.documentElement.clientWidth + windowHeight = document.documentElement.clientHeight + } + else + { + windowWidth = 800; + windowHeight = 600; + } + minZoom = windowHeight/viewHeight; + maxZoom = 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+')'; + + g.setAttribute('transform',a); + + setAttributes(root, { + "onmousedown" : "handleMouseDown(evt)", + "onmousemove" : "handleMouseMove(evt)", + "onmouseup" : "handleMouseUp(evt)" + }); + + if (window.addEventListener) + { + if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || navigator.userAgent.toLowerCase().indexOf("opera") >= 0) + window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari + 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; + } + } +} + +/** + * Instance an SVGPoint object with given event coordinates. + */ +function getEventPoint(evt) +{ + var p = root.createSVGPoint(); + p.x = evt.clientX; + p.y = evt.clientY; + return p; +} + +/** + * Sets the current transform matrix of an element. + */ +function setCTM(element, matrix) +{ + var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")"; + element.setAttribute("transform", s); +} + +/** + * Sets attributes of an element. + */ +function setAttributes(element, attributes) +{ + for (i in attributes) + element.setAttributeNS(null, i, attributes[i]); +} + +function doZoom(g,point,zoomFactor) +{ + var p = point.matrixTransform(g.getCTM().inverse()); + var k = root.createSVGMatrix().translate(p.x, p.y).scale(zoomFactor).translate(-p.x, -p.y); + var n = g.getCTM().multiply(k); + var s = Math.max(n.a,n.d); + if (s>maxZoom) n=n.translate(p.x,p.y).scale(maxZoom/s).translate(-p.x,-p.y); + else if (s<minZoom) n=n.translate(p.x,p.y).scale(minZoom/s).translate(-p.x,-p.y); + setCTM(g, n); + stateTf = stateTf.multiply(n.inverse()); +} + +/** + * Handle mouse move event. + */ +function handleMouseWheel(evt) +{ + if (!evt) evt = window.evt; + if (evt.preventDefault) evt.preventDefault(); + evt.returnValue = false; + + if (state!='pan') + { + + var delta; + + if(evt.wheelDelta) + { + if (window.opera) + { + delta = evt.wheelDelta / 720; // Opera + } + else + { + delta = evt.wheelDelta / 7200; // Chrome/Safari/Opera + } + } + else + { + delta = evt.detail / -180; // Mozilla + } + + var svgDoc = evt.target.ownerDocument; + var g = svgDoc.getElementById("viewport"); + var p = getEventPoint(evt); + doZoom(g,p,1+delta); + } +} + +/** + * Handle mouse move event. + */ +function handleMouseMove(evt) +{ + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var g = svgDoc.getElementById("viewport"); + + if (state == 'pan') + { + // Pan mode + var p = getEventPoint(evt).matrixTransform(stateTf); + setCTM(g,stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y)); + } +} + +/** + * Handle click event. + */ +function handleMouseDown(evt) +{ + if(evt.preventDefault) + evt.preventDefault(); + evt.returnValue = false; + var g = svgDoc.getElementById("viewport"); + state = 'pan'; + stateTf = g.getCTM().inverse(); + stateOrigin = getEventPoint(evt).matrixTransform(stateTf); + g.style.cursor = cursorGrab; +} + +/** + * Handle mouse button release event. + */ +function handleMouseUp(evt) +{ + if (evt.preventDefault) evt.preventDefault(); + evt.returnValue = false; + var g = svgDoc.getElementById("viewport"); + g.style.cursor = "default"; + // Quit pan mode + state = ''; +} + +function handlePan(x,y) +{ + var g = svgDoc.getElementById("viewport"); + setCTM(g,g.getCTM().translate(x*20/minZoom,y*20/minZoom)); +} + +/** + * 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; +} + +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.y = windowHeight/2; + doZoom(g,p,factor); +} + diff --git a/src/svgpan_js.h b/src/svgpan_js.h new file mode 100644 index 0000000..0714d6d --- /dev/null +++ b/src/svgpan_js.h @@ -0,0 +1,271 @@ +"/**\n" +" * The code below is based on SVGPan Library 1.2 and was modified for doxygen\n" +" *\n" +" * This code is licensed under the following BSD license:\n" +" *\n" +" * Copyright 2009-2010 Andrea Leofreddi <a.leofreddi@itcharm.com>. All rights reserved.\n" +" * \n" +" * Redistribution and use in source and binary forms, with or without modification, are\n" +" * permitted provided that the following conditions are met:\n" +" * \n" +" * 1. Redistributions of source code must retain the above copyright notice, this list of\n" +" * conditions and the following disclaimer.\n" +" * \n" +" * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n" +" * of conditions and the following disclaimer in the documentation and/or other materials\n" +" * provided with the distribution.\n" +" * \n" +" * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED\n" +" * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n" +" * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR\n" +" * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n" +" * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n" +" * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n" +" * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" +" * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n" +" * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" +" * \n" +" * The views and conclusions contained in the software and documentation are those of the\n" +" * authors and should not be interpreted as representing official policies, either expressed\n" +" * or implied, of Andrea Leofreddi.\n" +" */\n" +"\n" +"var root = document.documentElement;\n" +"var state = 'none';\n" +"var stateOrigin;\n" +"var stateTf = root.createSVGMatrix();\n" +"var cursorGrab = ' url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRFAAAA////////c3ilYwAAAAN0Uk5T//8A18oNQQAAAD1JREFUeNp0zlEKACAIA9Bt9z90bZBZkQj29qFBEuBOzQHSnWTTyckEfqUuZgFvslH4ch3qLCO/Kr8cAgwATw4Ax6XRCcoAAAAASUVORK5CYII=\"), move';\n" +"var zoomSteps = 10;\n" +"var zoomInFactor;\n" +"var zoomOutFactor;\n" +"var windowWidth;\n" +"var windowHeight;\n" +"var svgDoc;\n" +"var minZoom;\n" +"var maxZoom;\n" +"if (!window) window=this;\n" +"\n" +"/**\n" +" * Register handlers\n" +" */\n" +"function init(evt) \n" +"{\n" +" svgDoc = evt.target.ownerDocument;\n" +" if (window.innerHeight) // Firefox\n" +" {\n" +" windowWidth = window.innerWidth;\n" +" windowHeight = window.innerHeight;\n" +" }\n" +" else if (document.documentElement.clientWidth) // Chrome/Safari\n" +" {\n" +" windowWidth = document.documentElement.clientWidth\n" +" windowHeight = document.documentElement.clientHeight\n" +" }\n" +" else\n" +" {\n" +" windowWidth = 800;\n" +" windowHeight = 600;\n" +" }\n" +" minZoom = windowHeight/viewHeight;\n" +" maxZoom = 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" +"\n" +" g.setAttribute('transform',a);\n" +"\n" +" setAttributes(root, {\n" +" \"onmousedown\" : \"handleMouseDown(evt)\",\n" +" \"onmousemove\" : \"handleMouseMove(evt)\",\n" +" \"onmouseup\" : \"handleMouseUp(evt)\"\n" +" });\n" +"\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" +" else\n" +" window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others\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" +"}\n" +"\n" +"/**\n" +" * Instance an SVGPoint object with given event coordinates.\n" +" */\n" +"function getEventPoint(evt) \n" +"{\n" +" var p = root.createSVGPoint();\n" +" p.x = evt.clientX;\n" +" p.y = evt.clientY;\n" +" return p;\n" +"}\n" +"\n" +"/**\n" +" * Sets the current transform matrix of an element.\n" +" */\n" +"function setCTM(element, matrix) \n" +"{\n" +" var s = \"matrix(\" + matrix.a + \",\" + matrix.b + \",\" + matrix.c + \",\" + matrix.d + \",\" + matrix.e + \",\" + matrix.f + \")\";\n" +" element.setAttribute(\"transform\", s);\n" +"}\n" +"\n" +"/**\n" +" * Sets attributes of an element.\n" +" */\n" +"function setAttributes(element, attributes)\n" +"{\n" +" for (i in attributes)\n" +" element.setAttributeNS(null, i, attributes[i]);\n" +"}\n" +"\n" +"function doZoom(g,point,zoomFactor)\n" +"{\n" +" var p = point.matrixTransform(g.getCTM().inverse());\n" +" var k = root.createSVGMatrix().translate(p.x, p.y).scale(zoomFactor).translate(-p.x, -p.y);\n" +" var n = g.getCTM().multiply(k);\n" +" var s = Math.max(n.a,n.d);\n" +" if (s>maxZoom) n=n.translate(p.x,p.y).scale(maxZoom/s).translate(-p.x,-p.y);\n" +" else if (s<minZoom) n=n.translate(p.x,p.y).scale(minZoom/s).translate(-p.x,-p.y);\n" +" setCTM(g, n);\n" +" stateTf = stateTf.multiply(n.inverse());\n" +"}\n" +"\n" +"/**\n" +" * Handle mouse move event.\n" +" */\n" +"function handleMouseWheel(evt) \n" +"{\n" +" if (!evt) evt = window.evt;\n" +" if (evt.preventDefault) evt.preventDefault();\n" +" evt.returnValue = false;\n" +"\n" +" if (state!='pan')\n" +" {\n" +"\n" +" var delta;\n" +"\n" +" if(evt.wheelDelta)\n" +" {\n" +" if (window.opera)\n" +" {\n" +" delta = evt.wheelDelta / 720; // Opera\n" +" }\n" +" else\n" +" {\n" +" delta = evt.wheelDelta / 7200; // Chrome/Safari/Opera\n" +" }\n" +" }\n" +" else\n" +" {\n" +" delta = evt.detail / -180; // Mozilla\n" +" }\n" +"\n" +" var svgDoc = evt.target.ownerDocument;\n" +" var g = svgDoc.getElementById(\"viewport\");\n" +" var p = getEventPoint(evt);\n" +" doZoom(g,p,1+delta);\n" +" }\n" +"}\n" +"\n" +"/**\n" +" * Handle mouse move event.\n" +" */\n" +"function handleMouseMove(evt) \n" +"{\n" +" if(evt.preventDefault)\n" +" evt.preventDefault();\n" +"\n" +" evt.returnValue = false;\n" +"\n" +" var g = svgDoc.getElementById(\"viewport\");\n" +"\n" +" if (state == 'pan') \n" +" {\n" +" // Pan mode\n" +" var p = getEventPoint(evt).matrixTransform(stateTf);\n" +" setCTM(g,stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y));\n" +" } \n" +"}\n" +"\n" +"/**\n" +" * Handle click event.\n" +" */\n" +"function handleMouseDown(evt) \n" +"{\n" +" if(evt.preventDefault)\n" +" evt.preventDefault();\n" +" evt.returnValue = false;\n" +" var g = svgDoc.getElementById(\"viewport\");\n" +" state = 'pan';\n" +" stateTf = g.getCTM().inverse();\n" +" stateOrigin = getEventPoint(evt).matrixTransform(stateTf);\n" +" g.style.cursor = cursorGrab;\n" +"}\n" +"\n" +"/**\n" +" * Handle mouse button release event.\n" +" */\n" +"function handleMouseUp(evt) \n" +"{\n" +" if (evt.preventDefault) evt.preventDefault();\n" +" evt.returnValue = false;\n" +" var g = svgDoc.getElementById(\"viewport\");\n" +" g.style.cursor = \"default\";\n" +" // Quit pan mode\n" +" state = '';\n" +"}\n" +"\n" +"function handlePan(x,y)\n" +"{\n" +" var g = svgDoc.getElementById(\"viewport\");\n" +" setCTM(g,g.getCTM().translate(x*20/minZoom,y*20/minZoom));\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" +"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.y = windowHeight/2;\n" +" doZoom(g,p,factor);\n" +"}\n" +"\n" diff --git a/src/translator_am.h b/src/translator_am.h new file mode 100644 index 0000000..bb286d5 --- /dev/null +++ b/src/translator_am.h @@ -0,0 +1,1835 @@ +/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ */
+
+/*
+ * Translation by
+ * Armen Tangamyan <armen.tangamyan@anu.edu.au>
+ */
+
+#ifndef TRANSLATOR_AM_H
+#define TRANSLATOR_AM_H
+
+class TranslatorArmenian : public Translator
+{
+ public:
+ /*! Used for identification of the language. */
+ virtual QCString idLanguage()
+ { return "armenian"; }
+
+ /* Used to get the command(s) for the language support. */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "<pre>\\usepackage[latin]{armtex}\n"
+ "\\usepackage[armscii8]{inputenc}\n</pre>";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Դասին վերաբերվող ֆունկցիաներ"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Հաշվի առեք, որ սրանք անդամ ֆունկցիաներ չեն)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Մանրամասն նկարագրություն"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Անդամ տիպի սահմանումներ (typedef)"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Անդամ hամարակալումներ"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Անդամ ֆունկցիաներ"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Դաշտեր";
+ }
+ else
+ {
+ return "Անդամ տվյալներ";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Մանրամասն..."; }
+
+ /*! put in the class documentation */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trListOfAllMembers()
+ {
+ return "Բոլոր անդամների ցուցակը";
+ }
+
+ /*! used as the title of the "list of all members" page of a class */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trMemberList()
+ {
+ return "Անդամների ցուցակ";
+ }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Սա դասի անդամների ամբողջական ցուցակն է "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trIncludingInheritedMembers()
+ { 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+=s+(QCString)" համար:";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "համարակալման անուն"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "համարակալման արժեք"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "սահմանված"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Մոդուլներ"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { 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 "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ 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 all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Տվյալների դաշտեր";
+ }
+ else
+ {
+ return "Դասի անդամներ";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ /*??*/
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Գլոբալներ";
+ }
+ else
+ {
+ return "Ֆայլի անդամներ";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Նմանատիպ էջեր"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Օրինակներ"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Որոնում"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Այս ժառանգման ցուցակը կոպտորեն է տեսակավորված, "
+ "բայց ոչ ամբողջապես, այբբենական կարգով.";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="ֆայլերի մի ցուցակ` կարճ բացատրություններով:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Տվյալների կառուցվածքը` կարճ բացատրություններով.";
+ }
+ else
+ {
+ return "Դասերը, կառուցվածքները, միավորումները "
+ "և ինտերֆեյսները` կարճ բացատրություններով.";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if(!extractAll) result+="փաստագրված ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="կառուցվածքների և միավորումների դաշտերի ";
+ else
+ result+="դասի անդամների ";
+ result+="ցուցակը`";
+ result+=" հղումներով դեպի ";
+ if(!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="կառուցվածք/միավորում փաստագրությունները բոլոր անդամների համար.";
+ else
+ result+="դասի փաստագրությունը բոլոր անդամների համար.";
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result += "կառուցվածքները/միավորումները, որոնց նրանք պատկանում են.";
+ else
+ result += "դասերը, որոնց նրանք պատկանում են.";
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="ֆունկցիաների, փոփոխականների, մակրո-հայտարարությունների, "
+ "համարակալումների և տիպի սահմանումների (typedef)";
+ }
+ else
+ {
+ result+="ֆայլի անդամների ";
+ }
+ result+="ցուցակը`";
+ result+=" հղումներով դեպի ";
+ if (extractAll)
+ result+="ֆայլերը, որոնց նրանք պատկանում են.";
+ else
+ result+="փաստագրությունը.";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Բոլոր օրինակների ցուցակը."; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Բոլոր նմանատիպ փաստագրության էջերի ցուցակը."; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { 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 " - Փաստագրություն"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Մոդուլներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Դասակարգումներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Ֆայլեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Մոդուլներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Տվյալների կառուցվածքներ";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Ֆայլեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Օրինակներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Էջեր"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Հղումների ձեռնարկ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Մակրոսներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Ֆունկցիաների նախատիպեր"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Տիպի սահմանումներ (typedef)"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Համարակալումներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Ֆունկցիաներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Փոփոխականներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Հաշվիչ"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Մակրոսներ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Ֆունկցիաների նախատիպեր"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Տիպի սահմանումներ (typedef)"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Համարակալման տիպեր"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Ֆունկցիաներ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Փոփոխականներ"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+
+ }
+
+ /*! This is used in the documentation of a group before the list of
+ * links to documented files
+ */
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Ստեղծվել է "+date;
+ if (projName) result+=projName+QCString(" -ի համար,");
+ result+=(QCString)" հետևյալ համակարգով.";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "Հեղինակ - ";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return clName+QCString(" -ի ժառանգման գծագիրը.");
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Միայն ներքին օգտագործման համար"; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Զգուշացում"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Տարբերակ"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Տարեթիվ"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Վերադարձնում է"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Տեսեք նաև"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Պարամետրեր"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Բացառություններ"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Ստեղծված է հետևյալ համակարգի կողմից"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Անունների տարածությունների ցուցակ"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="անունների տարածությունների ցուցակը` կարճ բացատրություններով.";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Ընկերներ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Դասի ընկերներ և կապված ֆունկցիաներ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ if (isTemplate)
+ {
+ 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;
+ }
+ result+=" Ձևանմուշներ";
+ }
+ else
+ {
+ 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;
+ }
+ }
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ return fileName+QCString(" ֆայլեր");
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" անունների տարածություններ";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Բաց անդամ ֆունկցիաներ"; }
+ virtual QCString trPublicSlots()
+ { return "Բաց սլոթեր"; }
+ virtual QCString trSignals()
+ { return "Ազդանշաններ"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Բաց ստատիկ անդամ ֆունկցիաներ"; }
+ virtual QCString trProtectedMembers()
+ { return "Պաշտպանված անդամ ֆունկցիաներ"; }
+ virtual QCString trProtectedSlots()
+ { return "Պաշտպանված սլոթեր"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Պաշտպանված ստատիկ անդամ ֆունկցիաներ"; }
+ virtual QCString trPrivateMembers()
+ { return "Փակ ֆունկցիաներ"; }
+ virtual QCString trPrivateSlots()
+ { return "Փակ սլոթեր"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Փակ ստատիկ անդամ ֆունկցիաներ"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" և ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Հենքային դասեր - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Ժառանգորդ դասեր - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Վերասահմանված ֆունկցիաներ - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Վերասահմանված է "+trWriteList(numEntries)+" ում:";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Անունների տարածության անդամներ"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(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 namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Անունների տարածություններ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Անունների տարածություն"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Անունների տարածություններ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ {
+ 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+="արձանագրության"; break;
+ case ClassDef::Category: result+="դասակարգման"; break;
+ case ClassDef::Exception: result+="բացառության"; break;
+ }
+ result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";
+ if (single) result+="ից."; else result+="երից.";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Այբբենական ցուցակ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Վերադարձվող արժեքներ"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { 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 "էջ:"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Սահմանումը @1 ֆայլի @0 տողում է:";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Սահմանումը @0 ֆայլում է:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Հնացած է";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)clName+"-ի համագործակցությունների գծագիր.";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)fName+"-ի ներառումների կախվածությունների գծագիր.";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Կառուցիչներ";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Տե'ս այս ֆայլի ելքային կոդը";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Տե'ս այս ֆայլի փաստագրությունը:";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Նախապայման";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Հետպայման";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Անփոփոխ";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Նախնական արժեք";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "Ելքային կոդ";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Գրաֆիկական դասերի հիերարխիա:";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Տե'ս դասերի գրաֆիկական հիերարխիան:";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Տե'ս դասերի տեքստային հիերարխիան:";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "էջեր";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Նշում";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Բաց տիպեր";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Տվյալների դաշտեր";
+ }
+ else
+ {
+ return "Բաց ատրիբուտներ";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Բաց ստատիկ ատրիբուտներ";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Պաշտպանված տիպեր";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Պաշտպանված ատրիբուտներ";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Պաշտպանված ստատիկ ատրիբուտներ";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Փակ տիպեր";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Փակ ատրիբուտներ";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Փակ ստատիկ ատրիբուտներ";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ /*??*/
+ {
+ return "Կատարման ենթակա";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ /*??*/
+ {
+ return "Խնդիրների ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Օգտագործվում է հետևյալում - ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Դիտողություններ";
+ }
+ virtual QCString trAttention()
+ {
+ return "Ուշադրություն";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Այս գրաֆը ցույց է տալիս, թե որ ֆայլերն են "
+ "ուղղակի կամ անուղղակի ներառում տվյալ ֆայլը.";
+ }
+ virtual QCString trSince()
+ /*??*/
+ {
+ return "Սկսած";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Լեգենդ";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Այս էջը նկարագրում է, թե ինչպես մեկնաբանել doxygen-ի ստեղծած գրաֆները:<p>\n"
+ "Դիտարկենք հետևյալ օրինակը.\n"
+ "\\code\n"
+ "/*! Կրճատման հետևանքով անտեսանելի դաս */\n"
+ "class Invisible { };\n\n"
+ "/*! Կրճատված դաս, ժառանգությունների հարաբերությունը փակ է */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Չփաստագրված դաս */\n"
+ "class Undocumented { };\n\n"
+ "/*! Բաց ժառանգում */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Դասի ձևաչափ */\n"
+ "template<class T> class Templ {};\n\n"
+ "/*! Պաշտպանված ժառանգում */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Փակ ժառանգում */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Դաս, որը օգտագործվում է Inherited դասի կողմից */\n"
+ "class Used { };\n\n"
+ "/*! Դաս, որը ժառանգում է մի շարք այլ դասերից */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Եթե \\c MAX_DOT_GRAPH_HEIGHT -ին վերագրված է "
+ "240, ապա կստանանք հետևյալ գրաֆը."
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Այս գրաֆի ուղղանկյունները ունեն հետևյալ իմաստը.\n"
+ "<ul>\n"
+ "<li>Լցոնվաց մոխրագույն ուղղանկյունը ներկայացնում է այն դասը կամ կառուցվածքը, "
+ "որի համար ստեղծվել է տվյալ գրաֆը:</li>\n"
+ "<li>Սև եզրերով ուղղանկյունը նշանակում է փաստագրված դաս կամ կարուցվածք:</li>\n"
+ "<li>Մոխրագույն եզրերով ուղղանկյունը նշանակում է չփաստագրված դաս կամ կառուցվածք:</li>\n"
+ "<li>Կարմիր եզրերով ուղղանկյունը նշանակում է դաս կամ կառուցվածք, որի համար\n"
+ " ոչ բոլոր ժառանգում/պարունակում կապերն են ցուցադրված: Գրաֆը կրճատված է, "
+ "եթե այն չի տեղավորվում նշված սահմաններում:</li>\n"
+ "</ul>\n"
+ "Սլաքները ունեն հետևյալ իմաստը.\n"
+ "<ul>\n"
+ "<li>Մուգ կապույտ սլաքը օգտագործվում է երկու դասերի միջև բաց ժառանգում "
+ "կապը ցուցադրելու համար:</li>\n"
+ "<li>Մուգ կանաչ սլաքը օգտագործվում է պաշտպանված ժառանգման համար:</li>\n"
+ "<li>Մուգ կարմիր սլաքը օգտագործվում է փակ ժառանգման համար:</li>\n"
+ "<li>Մանուշակագույն կետագիծ սլաքը օգտագորշվում է, եթե դասը պարունակվում է"
+ "այլ դասում կամ օգտագորշվում է այլ դասի կողմից: Սլաքը պիտակավորվաշ է"
+ "փոփոխական(ներ)ով, որի միջոցով մատնանշված դասը կամ կառուցվածքը հասանելի է:</li>\n"
+ "<li>Դեզին կետագիծ սլաքը ցույց է տալիս ձևանմուշի օրինակի կապը այն ձևանմուշի հետ, "
+ "որից այն իրականցվել է. Սլաքը պիտակավորված է օրինակի ձևանմուշային պարամետրերով:</li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "լեգենդ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Թեստ";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Թեստերի ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP անդամ ֆունկցիաներ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Հատկություններ";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Հատկություններ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Փաթեթ "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Փաթեթների ցուցակ";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Բոլոր փաթեթները` կարճ բացատրություններով (եթե հասանելի են).";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Փաթեթներ";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Արժեքներ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Սխալ";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Սխալների ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "armscii-8";
+ }
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ 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 trClass(bool first_capital, bool singular)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ QCString result((first_capital ? "Տվյալների կառուցվածք" : "տվյալների կառուցվածք"));
+ return result;
+ }
+ else
+ {
+ QCString result((first_capital ? "Դաս" : "դաս"));
+ if(!singular) 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 trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ֆայլ" : "ֆայլ"));
+ if (!singular) 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 trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Անունների տարածություն" : "անունների տարածություն"));
+ if (!singular) 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 trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Խ" : "խ"));
+ result+=(singular ? "ումբ" : "մբեր");
+ 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 trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Էջ" : "էջ"));
+ if (!singular) 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 trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Անդամ" : "անդամ"));
+ if (!singular) 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 trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Գլոբալ" : "գլոբալ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Հեղինակ" : "հեղինակ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Հղումներ - ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Իրագործում է հետևյալ դաս(եր)ի ֆունկցիաները - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Իրագործվում է հետևյալում - "+trWriteList(numEntries)+":";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Բովանդակություն";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Հնացած սահմանումների ցուցակը";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Պատահարներ";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Պատահարների ցուցակը";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Փաթեթի տիպեր";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Փաթեթի ֆունկցիաներ";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Փաթեթի ստատիկ ֆունկցիաներ";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Փաթեթի ատրիբուտներ";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Փաթեթի ստատիկ ատրիբուտներ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Բոլոր";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Այս ֆունկցիայի կանչերի գրաֆը.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Որոնում";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Որոնման արդյունքները";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Ներեցեք, բայց Ձեր որոնումը արդյունք չտվեց:";
+ }
+ else if( numDocuments == 1 )
+ {
+ return "Հայտնաբերվել է 1 փաստաթուղթ:";
+ }
+ else
+ {
+ return "Հայտնաբերվել է <b>$num</b> փաստաթուղթ:"
+ "Փաստաթղթերը դասակարգված են ըստ համապասխանության";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Որոնման արդյունքներ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Ելակետային ֆայլ " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Ֆայլադարանների հիերարխիա"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Ֆայլադարաններ"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Ֆայլադրաններ"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { 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=dirName; result+=" Ֆայլադարան"; 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+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Սա վերաբեռնված ֆունկցիա է` տրամադրված հարմարության համար: "
+ "Այն տարբերվում է նախնականից միայն արգումնետներով:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Այս ֆունկցիայի կանչերի գրաֆը.";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Համարակալումներ"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// 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+="տվյալների տիպերի անդամների ցուցակը` հղումներով դեպի ";
+ 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;
+ if (!isTemplate)
+ {
+ 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;
+ }
+ }
+ else
+ {
+ 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;
+ }
+ result+=" Ձևանմուշ";
+ }
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ return QCString("Մոդուլ ") + namespaceName;
+ }
+
+ /*! 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+="ներ";
+ 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+="ինտերֆեյսի"; 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+="եր";
+ 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 %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
diff --git a/src/translator_gr.h b/src/translator_gr.h index c5b6c47..5fc4ba3 100644 --- a/src/translator_gr.h +++ b/src/translator_gr.h @@ -158,7 +158,7 @@ class TranslatorGreek : public Translator } else { - return "Λίστα Συσσωματωμάτων"; + return "Λίστα Κλάσεων"; } } @@ -171,11 +171,11 @@ class TranslatorGreek : public Translator { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { - return "Πεδία Δεδομένων"; + return "Μέλη Δομών Δεδομένων"; } else { - return "Μέλη Συσσωματώματα"; + return "Μέλη Κλάσεων"; } } @@ -206,9 +206,7 @@ class TranslatorGreek : public Translator /*! 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) @@ -229,8 +227,8 @@ class TranslatorGreek : public Translator } else { - return "Ακολουθούνε οι κλάσεις, οι δομές, " - "τα σώματα και οι διαπροσωπίες με σύντομες περιγραφές:"; + return "Ακολουθούνε οι κλάσεις, δομές, " + "ενώσεις και οι διασυνδέσεις με σύντομες περιγραφές:"; } } @@ -244,7 +242,7 @@ class TranslatorGreek : public Translator } if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { - result+="πεδίων δομών και σωμάτων "; + result+="μελών δομών δεδομένων και ενώσεων "; } else { @@ -391,7 +389,7 @@ class TranslatorGreek : public Translator /*! 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 @@ -482,7 +480,7 @@ class TranslatorGreek : public Translator } else { - return "Συσσωματώματα"; + return "Κλάσεις"; } } @@ -551,14 +549,14 @@ class TranslatorGreek : public Translator /*! used as the title of page containing all the index of all namespaces. */ virtual QCString trNamespaceList() - { return "Λίστα Namespace"; } + { return "Λίστα Χώρων Ονομάτων"; } /*! used as an introduction to the namespace list */ virtual QCString trNamespaceListDescription(bool extractAll) { QCString result="Ακολουθέι η λίστα όλων των "; if (!extractAll) result+="τεκμηριωμένων "; - result+="Namespace με σύντομες περιγραφές:"; + result+="Χώρων Ονομάτων με σύντομες περιγραφές:"; return result; } @@ -587,8 +585,8 @@ class TranslatorGreek : public Translator ClassDef::CompoundType compType, bool isTemplate) { - QCString result=(QCString)clName+" "; - result+=" Αναφορά"; + QCString result=(QCString)"Αναφορά"; + if (isTemplate) result+=" Προτύπου"; switch(compType) { case ClassDef::Class: result+=" Κλάσης"; break; @@ -599,24 +597,23 @@ class TranslatorGreek : public Translator case ClassDef::Category: result+=" Κατηγορίας"; break; case ClassDef::Exception: result+=" Εξαίρεσης"; break; } - if (isTemplate) result+=" Template"; - + result+=clName; return result; } /*! used as the title of the HTML page of a file */ virtual QCString trFileReference(const char *fileName) { - QCString result=fileName; - result+=" Αναφορά Αρχείου"; + QCString result="Αναφορά Αρχείου "; + result+=fileName; return result; } /*! used as the title of the HTML page of a namespace */ virtual QCString trNamespaceReference(const char *namespaceName) { - QCString result=namespaceName; - result+=" Αναφορά Namespace"; + QCString result="Αναφορά Χώρου Ονομάτων "; + result+=namespaceName; return result; } @@ -635,11 +632,11 @@ class TranslatorGreek : public Translator virtual QCString trStaticProtectedMembers() { return "Στατικές Προστατευμένες Μέδοδοι"; } virtual QCString trPrivateMembers() - { return "Ιδιοτικές Μέδοδοι"; } + { return "Ιδιωτικές Μέθοδοι"; } virtual QCString trPrivateSlots() { 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. @@ -700,7 +697,7 @@ class TranslatorGreek : public Translator /*! This is put above each page as a link to all members of namespaces. */ virtual QCString trNamespaceMembers() - { return "Μέλη Namespace"; } + { return "Μέλη Χώρου Ονομάτων"; } /*! This is an introduction to the page with all namespace members */ virtual QCString trNamespaceMemberDescription(bool extractAll) diff --git a/src/util.cpp b/src/util.cpp index b64ac28..3621f50 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -5128,8 +5128,11 @@ QCString stripScope(const char *name) switch (c) { case ':': + // only exit in the case of :: //printf("stripScope(%s)=%s\n",name,result.right(l-p-1).data()); - return result.right(l-p-1); + if (p>0 && result.at(p-1)==':') return result.right(l-p-1); + p--; + break; case '>': if (skipBracket) // we don't care about brackets { @@ -5480,9 +5483,29 @@ void addMembersToMemberGroup(MemberList *ml, * class \a name and a template argument list \a templSpec. If -1 is returned * there are no more matches. */ -int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCString &templSpec) +int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCString &templSpec,SrcLangExt lang) { - static const QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9:\\x80-\\xFF]*"); + static const QRegExp re_norm("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9:\\x80-\\xFF]*"); + static const QRegExp re_ftn("[a-z_A-Z\\x80-\\xFF][()=_a-z_A-Z0-9:\\x80-\\xFF]*"); + QRegExp re; + + if (lang == SrcLangExt_F90) + { + if (type.at(pos)==',') return -1; + if (type.left(4).lower()=="type") + { + re = re_norm; + } + else + { + re = re_ftn; + } + } + else + { + re = re_norm; + } + name.resize(0); templSpec.resize(0); int i,l; @@ -6471,6 +6494,41 @@ QCString parseCommentAsText(const Definition *scope,const MemberDef *md, static QDict<void> aliasesProcessed; +static QCString replaceAliasArgument(const QCString &aliasValue,int paramNum, + const QCString ¶mValue); + +static QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList) +{ + QCString result = aliasValue; + QList<QCString> args; + int p=0,i,c=1,l=(int)argList.length(); + // first count the number of arguments the command has + // (= number of unescaped commas plus 1) + for (i=0;i<l;i++) + { + if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\')) c++; + } + // next we substitute the \<number> by the argument values, starting + // with the last one. This is needed to avoid that \10 is treated as + // a \1 followed by a 0 and already expanded as the first parameter. + p = l; + for (i=l-1;i>=0;i--) + { + if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\')) + { + result = replaceAliasArgument(result,c,argList.mid(i+1,p-i-1)); + p=i; + c--; + } + } + // special case for the first argument, whose value is not preceded by a , + if (p>0) + { + result = replaceAliasArgument(result,c,argList.left(p)); + } + return result; +} + QCString expandAliasRec(const QCString s) { QCString result; @@ -6492,8 +6550,8 @@ QCString expandAliasRec(const QCString s) { cmd = value.mid(i+1,l-1); } - //printf("Found command '%s' args='%s'\n",cmd.data(),args.data()); QCString *aliasText=Doxygen::aliasDict.find(cmd); + //printf("Found command '%s' args='%s' aliasText=%s\n",cmd.data(),args.data(),aliasText?aliasText->data():"<none>"); if (aliasesProcessed.find(cmd)==0 && aliasText) // expand the alias { //printf("is an alias!\n"); @@ -6551,29 +6609,8 @@ static QCString replaceAliasArgument(const QCString &aliasValue,int paramNum, result = substitute(result,"\\{","{"); result = substitute(result,"\\}","}"); result = expandAliasRec(substitute(result,"\\,",",")); - //printf("replaceAliasArgument('%s',%d,'%s')->%s\n", - // aliasValue.data(),paramNum,paramValue.data(),result.data()); - return result; -} - -QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList) -{ - QCString result = aliasValue; - QList<QCString> args; - int p=0,i,c=1; - for (i=0;i<(int)argList.length();i++) - { - if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\')) - { - result = replaceAliasArgument(result,c,argList.mid(p,i-p)); - p=i+1; - c++; - } - } - if (p<(int)argList.length()) - { - result = replaceAliasArgument(result,c,argList.right(argList.length()-p)); - } + printf("replaceAliasArgument('%s',%d,'%s')->%s\n", + aliasValue.data(),paramNum,paramValue.data(),result.data()); return result; } @@ -267,7 +267,7 @@ void addMembersToMemberGroup(/* in */ MemberList *ml, /* in */ Definition *context); int extractClassNameFromType(const QCString &type,int &pos, - QCString &name,QCString &templSpec); + QCString &name,QCString &templSpec,SrcLangExt=SrcLangExt_Unknown); QCString substituteTemplateArgumentsInString( const QCString &name, @@ -367,7 +367,7 @@ QCString extractAliasArgs(const QCString &args,int pos); int countAliasArguments(const QCString argList); -QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList); +//QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList); QCString resolveAliasCmd(const QCString aliasCmd); QCString expandAlias(const QCString &aliasName,const QCString &aliasValue); diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index d1d9198..2698c01 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -421,6 +421,8 @@ void XmlDocVisitor::visitPre(DocSimpleSect *s) m_t << "pre"; break; case DocSimpleSect::Post: m_t << "post"; break; + case DocSimpleSect::Copyright: + m_t << "copyright"; break; case DocSimpleSect::Invar: m_t << "invariant"; break; case DocSimpleSect::Remark: |