53 TDocOutput(html), fHierarchyLines(0), fCurrentClass(cl),
54 fCurrentClassesTypedefs(typedefs), fParser(0)
90 std::ofstream classFile(filename);
92 if (!classFile.good()) {
93 Error(
"Make",
"Can't open file '%s' !", filename.Data());
125 classFile << std::endl <<
"<div id=\"functions\">" << std::endl;
128 classFile <<
"<h2><a id=\"" << mangled
129 <<
":Function_Members\"></a>Function Members (Methods)</h2>" << std::endl;
131 const char* tab4nbsp=
" ";
135 classFile <<
" <br /><b>" 136 << tab4nbsp <<
"This is an abstract class, constructors will not be documented.<br />" << std::endl
137 << tab4nbsp <<
"Look at the <a href=\"" 139 <<
"\">header</a> to check for available constructors.</b><br />" << std::endl;
150 classFile <<
"<div class=\"access\" ";
151 const char* accessID [] = {
"priv",
"prot",
"publ"};
152 const char* accesstxt[] = {
"private",
"protected",
"public"};
154 classFile <<
"id=\"func" << accessID[access] <<
"\"><b>" 155 << accesstxt[access] <<
":</b>" << std::endl
156 <<
"<table class=\"func\" id=\"tabfunc" << accessID[access] <<
"\" cellspacing=\"0\">" << std::endl;
158 TIter iMethWrap(methods);
168 classFile <<
"<tr class=\"func";
171 classFile <<
"\"><td class=\"funcret\">";
174 classFile <<
"virtual ";
176 classFile <<
" virtual";
180 classFile <<
"static ";
182 if (!isctor && !isdtor)
187 classFile <<
"</td><td class=\"funcname\"><a class=\"funcname\" href=\"";
191 classFile << htmlFile;
193 classFile <<
"#" << mangledM;
200 mangledM += overloadIdx;
202 classFile << mangledM <<
"\">";
204 classFile <<
"<span class=\"baseclass\">";
206 classFile <<
"::</span>";
212 bool propSignal =
false;
213 bool propMenu =
false;
214 bool propToggle =
false;
215 bool propGetter =
false;
217 propSignal = (strstr(method->
GetTitle(),
"*SIGNAL*"));
218 propMenu = (strstr(method->
GetTitle(),
"*MENU*"));
219 propToggle = (strstr(method->
GetTitle(),
"*TOGGLE*"));
220 propGetter = (strstr(method->
GetTitle(),
"*GETTER"));
221 if (propSignal || propMenu || propToggle || propGetter) {
222 classFile <<
"<span class=\"funcprop\">";
223 if (propSignal) classFile <<
"<abbr title=\"emits a signal\">SIGNAL</abbr> ";
224 if (propMenu) classFile <<
"<abbr title=\"has a popup menu entry\">MENU</abbr> ";
225 if (propToggle) classFile <<
"<abbr title=\"toggles a state\">TOGGLE</abbr> ";
229 getter.Remove(0, posGetter + 8);
230 classFile <<
"<abbr title=\"use " + getter +
"() as getter\">GETTER</abbr> ";
232 classFile <<
"</span>";
235 classFile <<
"</td></tr>" << std::endl;
237 classFile << std::endl <<
"</table></div>" << std::endl;
240 classFile <<
"</div>" << std::endl;
256 if (!haveDataMembers)
return;
258 classFile << std::endl <<
"<div id=\"datamembers\">" << std::endl;
261 classFile <<
"<h2><a name=\"" << mangled
262 <<
":Data_Members\"></a>Data Members</h2>" << std::endl;
265 const TList* datamembers = 0;
271 classFile <<
"<div class=\"access\" ";
272 const char* what =
"data";
273 if (access > 2) what =
"enum";
274 const char* accessID [] = {
"priv",
"prot",
"publ"};
275 const char* accesstxt[] = {
"private",
"protected",
"public"};
277 classFile <<
"id=\"" << what << accessID[access%3] <<
"\"><b>" 278 << accesstxt[access%3] <<
":</b>" << std::endl
279 <<
"<table class=\"data\" id=\"tab" << what << accessID[access%3] <<
"\" cellspacing=\"0\">" << std::endl;
281 TIter iDM(datamembers);
289 if (prevEnumName.
Length()) {
290 classFile <<
"<tr class=\"data";
293 classFile <<
"\"><td class=\"datatype\">};</td><td></td><td></td></tr>" << std::endl;
298 classFile <<
"<tr class=\"data";
302 classFile <<
"\"><td class=\"datatype\">";
308 if (enumName.EndsWith(
"::"))
309 enumName +=
"<i>[unnamed]</i>";
310 Ssiz_t startClassName = 0;
311 if (!enumName.BeginsWith(
"enum "))
312 classFile <<
"enum ";
317 if (endClassName !=
kNPOS && endClassName > 0 && enumName[endClassName - 1] ==
':') {
319 TSubString substr(enumName(startClassName, endClassName - startClassName + 1));
322 enumName.Insert(substr.
Start() + substr.
Length(),
"</span>");
323 enumName.Insert(substr.
Start(),
"<span class=\"baseclass\">");
325 classFile << enumName <<
" { ";
329 classFile <<
"static ";
336 classFile <<
"</td><td class=\"dataname\"><a ";
338 classFile <<
"href=\"";
341 classFile << htmlFile <<
"#";
343 classFile <<
"name=\"";
344 classFile << mangledM;
348 classFile << mangledM <<
"\">";
352 classFile <<
"<span class=\"baseclass\">";
354 classFile <<
"::</span>";
363 classFile <<
"[" << member->
GetMaxIndex(indx) <<
"]";
367 classFile <<
"</td>";
369 classFile <<
"<td class=\"datadesc\">";
371 }
else classFile <<
"<td>";
372 classFile <<
"</td></tr>" << std::endl;
375 if (prevEnumName.
Length()) {
376 classFile <<
"<tr class=\"data";
379 classFile <<
"\"><td class=\"datatype\">};</td><td></td><td></td></tr>" << std::endl;
381 classFile << std::endl <<
"</table></div>" << std::endl;
384 classFile <<
"</div>" << std::endl;
421 filenameInh +=
"_Inh";
428 filenameInhMem +=
"_InhMem";
430 RunDot(filenameInhMem, &out);
435 filenameIncl +=
"_Incl";
437 RunDot(filenameIncl, &out);
442 filenameLib +=
"_Lib";
444 RunDot(filenameLib, &out);
446 out <<
"<div class=\"tabs\">" << std::endl
447 <<
"<a id=\"img" << title <<
"_Inh\" class=\"tabsel\" href=\"inh/" << title <<
"_Inh.png\" onclick=\"javascript:return SetImg('Charts','inh/" << title <<
"_Inh.png');\">Inheritance</a>" << std::endl
448 <<
"<a id=\"img" << title <<
"_InhMem\" class=\"tab\" href=\"inhmem/" << title <<
"_InhMem.png\" onclick=\"javascript:return SetImg('Charts','inhmem/" << title <<
"_InhMem.png');\">Inherited Members</a>" << std::endl
449 <<
"<a id=\"img" << title <<
"_Incl\" class=\"tab\" href=\"incl/" << title <<
"_Incl.png\" onclick=\"javascript:return SetImg('Charts','incl/" << title <<
"_Incl.png');\">Includes</a>" << std::endl
450 <<
"<a id=\"img" << title <<
"_Lib\" class=\"tab\" href=\"lib/" << title <<
"_Lib.png\" onclick=\"javascript:return SetImg('Charts','lib/" << title <<
"_Lib.png');\">Libraries</a><br/>" << std::endl
451 <<
"</div><div class=\"classcharts\"><div class=\"classchartswidth\"></div>" << std::endl
452 <<
"<img id=\"Charts\" alt=\"Class Charts\" class=\"classcharts\" usemap=\"#Map" << title <<
"_Inh\" src=\"inh/" << title <<
"_Inh.png\"/></div>" << std::endl;
471 out <<
"<!--INHERITANCE TREE-->" << std::endl;
474 out <<
"<table><tr><td width=\"10%\"></td><td width=\"70%\">" 475 <<
"<a href=\"ClassHierarchy.html\">Inheritance Chart</a>:</td></tr>";
476 out <<
"<tr class=\"inhtree\"><td width=\"10%\"></td><td width=\"70%\">";
478 out <<
"<table class=\"inhtree\"><tr><td>" << std::endl;
479 out <<
"<table width=\"100%\" border=\"0\" ";
480 out <<
"cellpadding =\"0\" cellspacing=\"2\"><tr>" << std::endl;
482 out <<
"<table><tr>";
493 UInt_t bgcolor=255-depth*8;
495 while ((inheritFrom = (
TBaseClass *) nextBase())) {
498 out <<
"<td><table><tr>" << std::endl;
501 out <<
"</tr><tr>" << std::endl;
502 out <<
"<td bgcolor=\"" 503 <<
Form(
"#%02x%02x%02x", bgcolor, bgcolor, bgcolor)
504 <<
"\" align=\"right\">" << std::endl;
511 << (
const char *) inheritFrom->
GetName()
513 out <<
"</td>"<< std::endl;
516 out <<
"</tr></table></td>" << std::endl;
517 out <<
"<td>←</td>";
521 out <<
"<td>" << std::endl;
525 const char *className = classPtr->
GetName();
533 out <<
"<center><tt><a name=\"" << anchor;
534 out <<
"\" href=\"" << htmlFile <<
"\">";
536 out <<
"</a></tt></center>" << std::endl;
543 out <<
"<center><big><b><tt><a name=\"" << anchor;
544 out <<
"\" href=\"" << htmlFile <<
"\">";
546 out <<
"</a></tt></b></big></center>" << std::endl;
551 out <<
"</td>" << std::endl;
561 out <<
"<td><table><tr>" << std::endl;
565 out <<
"</tr></table>";
567 out <<
"</td><td align=\"left\"> <a href=\"ClassHierarchy.html\">[more...]</a>";
568 out<<
"</td>" << std::endl;
573 out <<
"</tr></table>" << std::endl;
575 out <<
"</td></tr></table></td></tr></table>"<<std::endl;
598 filename +=
"_Tree.pdf";
606 psCanvas->
SaveAs(filename);
620 std::ofstream outdot(filename);
621 outdot <<
"strict digraph G {" << std::endl
622 <<
"rankdir=RL;" << std::endl
623 <<
"ranksep=2;" << std::endl
624 <<
"nodesep=0;" << std::endl
625 <<
"size=\"8,10\";" << std::endl
626 <<
"ratio=auto;" << std::endl
627 <<
"margin=0;" << std::endl
628 <<
"node [shape=plaintext,fontsize=40,width=4,height=0.75];" << std::endl
631 std::stringstream ssDep;
632 std::list<TClass*> writeBasesFor;
637 outdot <<
"{" << std::endl;
638 while (!writeBasesFor.empty()) {
639 TClass* cl = writeBasesFor.front();
640 writeBasesFor.pop_front();
642 outdot <<
" \"" << cl->
GetName() <<
"\"";
645 outdot <<
" [URL=\"" << htmlFileName <<
"\"]";
646 outdot <<
";" << std::endl;
649 ssDep <<
" \"" << cl->
GetName() <<
"\" -> {";
653 ssDep <<
" \"" << base->
GetName() <<
"\";";
654 writeBasesFor.push_back(base->GetClassPointer());
656 ssDep <<
"}" << std::endl;
659 outdot <<
"}" << std::endl;
662 std::map<TClass*, Int_t> derivesFromMe;
663 std::map<TClass*, unsigned int> entriesPerDerived;
664 std::set<TClass*> wroteNode;
666 static const unsigned int maxClassesPerDerived = 20;
668 outdot <<
"{" << std::endl;
671 for (std::map<TClass*, Int_t>::iterator iDerived = derivesFromMe.begin();
672 iDerived != derivesFromMe.end(); ++iDerived) {
673 if (iDerived->second != level)
continue;
675 TIter iBaseOfDerived(iDerived->first->GetListOfBases());
678 TClass* writeAndMoreFor = 0;
679 while ((baseDerived = (
TBaseClass*) iBaseOfDerived())) {
680 TClass* clBaseDerived = baseDerived->GetClassPointer();
682 && wroteNode.find(clBaseDerived) != wroteNode.end()) {
683 unsigned int& count = entriesPerDerived[clBaseDerived];
684 if (count < maxClassesPerDerived) {
686 ssDep <<
"\"" << iDerived->first->GetName() <<
"\" -> \"" 687 << clBaseDerived->
GetName() <<
"\";" << std::endl;
689 }
else if (count == maxClassesPerDerived) {
690 writeAndMoreFor = clBaseDerived;
691 ssDep <<
"\"...andmore" << clBaseDerived->
GetName() <<
"\"-> \"" 692 << clBaseDerived->
GetName() <<
"\";" << std::endl;
699 wroteNode.insert(iDerived->first);
700 outdot <<
" \"" << iDerived->first->GetName() <<
"\"";
703 outdot <<
" [URL=\"" << htmlFileName <<
"\"]";
704 outdot <<
";" << std::endl;
705 }
else if (writeAndMoreFor) {
706 outdot <<
" \"...andmore" << writeAndMoreFor->
GetName()
707 <<
"\" [label=\"...and more\",fontname=\"Times-Italic\",fillcolor=lightgrey,style=filled];" << std::endl;
710 if (!levelExists)
break;
712 outdot <<
"}" << std::endl;
714 outdot << ssDep.str();
716 outdot <<
"}" << std::endl;
727 std::ofstream outdot(filename);
728 outdot <<
"strict digraph G {" << std::endl
729 <<
"ratio=auto;" << std::endl
730 <<
"rankdir=RL;" << std::endl
731 <<
"compound=true;" << std::endl
732 <<
"constraint=false;" << std::endl
733 <<
"ranksep=0.1;" << std::endl
734 <<
"nodesep=0;" << std::endl
735 <<
"margin=0;" << std::endl;
736 outdot <<
" node [style=filled,width=0.7,height=0.15,fixedsize=true,shape=plaintext,fontsize=10];" << std::endl;
738 std::stringstream ssDep;
739 const int numColumns = 3;
741 std::list<TClass*> writeBasesFor;
743 while (!writeBasesFor.empty()) {
744 TClass* cl = writeBasesFor.front();
745 writeBasesFor.pop_front();
749 outdot <<
"subgraph \"cluster" << cl->
GetName() <<
"\" {" << std::endl
750 <<
" color=lightgray;" << std::endl
751 <<
" label=\"" << cl->
GetName() <<
"\";" << std::endl;
753 outdot <<
" URL=\"" << htmlFileName <<
"\"" << std::endl;
762 std::map<std::string, TDataMember*> dmMap;
768 dmMap[dm->GetName()] = dm;
771 outdot <<
"subgraph \"clusterData0" << cl->
GetName() <<
"\" {" << std::endl
772 <<
" color=white;" << std::endl
773 <<
" label=\"\";" << std::endl
774 <<
" \"clusterNode0" << cl->
GetName() <<
"\" [height=0,width=0,style=invis];" << std::endl;
776 Int_t pos = dmMap.size();
778 Int_t newColumnEvery = (pos + numColumns - 1) / numColumns;
779 for (std::map<std::string, TDataMember*>::iterator iDM = dmMap.begin();
780 iDM != dmMap.end(); ++iDM, --pos) {
785 if (iDM == dmMap.begin())
786 prevColumnNode = nodeName;
788 outdot <<
"\"" << nodeName <<
"\" [label=\"" 791 outdot <<
",color=\"#FFCCCC\"";
793 outdot <<
",color=\"#FFFF77\"";
795 outdot <<
",color=\"#CCFFCC\"";
796 outdot <<
"];" << std::endl;
797 if (pos % newColumnEvery == 1) {
799 outdot <<
"};" << std::endl
800 <<
"subgraph \"clusterData" << column << cl->
GetName() <<
"\" {" << std::endl
801 <<
" color=white;" << std::endl
802 <<
" label=\"\";" << std::endl
803 <<
" \"clusterNode" << column << cl->
GetName() <<
"\" [height=0,width=0,style=invis];" << std::endl;
804 }
else if (iDM != dmMap.begin() && pos % newColumnEvery == 0) {
805 ssDep <<
"\"" << prevColumnNode
806 <<
"\" -> \"" << nodeName <<
"\""<<
" [style=invis,weight=100];" << std::endl;
807 prevColumnNode = nodeName;
811 while (column < numColumns - 1) {
813 outdot <<
" \"clusterNode" << column << cl->
GetName() <<
"\" [height=0,width=0,style=invis];" << std::endl;
816 outdot <<
"};" << std::endl;
822 std::map<std::string, TMethod*> methMap;
827 while ((meth = (
TMethod*) iMeth()))
828 methMap[meth->GetName()] = meth;
831 outdot <<
"subgraph \"clusterFunc0" << cl->
GetName() <<
"\" {" << std::endl
832 <<
" color=white;" << std::endl
833 <<
" label=\"\";" << std::endl
834 <<
" \"clusterNode0" << cl->
GetName() <<
"\" [height=0,width=0,style=invis];" << std::endl;
837 Int_t pos = methMap.size();
839 Int_t newColumnEvery = (pos + numColumns - 1) / numColumns;
840 for (std::map<std::string, TMethod*>::iterator iMeth = methMap.begin();
841 iMeth != methMap.end(); ++iMeth, --pos) {
846 if (iMeth == methMap.begin())
847 prevColumnNodeFunc = nodeName;
849 outdot <<
"\"" << nodeName <<
"\" [label=\"" << meth->
GetName() <<
"\"";
852 outdot <<
",color=\"#777777\"";
854 outdot <<
",color=\"#FFCCCC\"";
856 outdot <<
",color=\"#FFFF77\"";
858 outdot <<
",color=\"#CCFFCC\"";
859 outdot <<
"];" << std::endl;
860 if (pos % newColumnEvery == 1) {
862 outdot <<
"};" << std::endl
863 <<
"subgraph \"clusterFunc" << column << cl->
GetName() <<
"\" {" << std::endl
864 <<
" color=white;" << std::endl
865 <<
" label=\"\";" << std::endl;
866 }
else if (iMeth != methMap.begin() && pos % newColumnEvery == 0) {
867 ssDep <<
"\"" << prevColumnNodeFunc
868 <<
"\" -> \"" << nodeName <<
"\""<<
" [style=invis,weight=100];" << std::endl;
869 prevColumnNodeFunc = nodeName;
872 outdot <<
"};" << std::endl;
875 outdot <<
"}" << std::endl;
877 for (
Int_t pos = 0; pos < numColumns - 1; ++pos)
878 ssDep <<
"\"clusterNode" << pos << cl->
GetName() <<
"\" -> \"clusterNode" << pos + 1 << cl->
GetName() <<
"\" [style=invis];" << std::endl;
884 ssDep <<
" \"clusterNode" << numColumns - 1 << cl->
GetName() <<
"\" -> " 885 <<
" \"clusterNode0" << base->GetName() <<
"\" [ltail=\"cluster" << cl->
GetName()
886 <<
"\",lhead=\"cluster" << base->GetName() <<
"\"";
888 ssDep <<
",weight=0";
889 ssDep <<
"];" << std::endl;
890 writeBasesFor.push_back(base->GetClassPointer());
895 outdot << ssDep.str();
897 outdot <<
"}" << std::endl;
911 std::map<std::string, std::string> filesToParse;
912 std::list<std::string> listFilesToParse;
919 filesToParse[declFileName.
Data()] = real.
Data();
920 listFilesToParse.push_back(declFileName.
Data());
934 std::ofstream outdot(filename);
935 outdot <<
"strict digraph G {" << std::endl
936 <<
"ratio=compress;" << std::endl
937 <<
"rankdir=TB;" << std::endl
938 <<
"concentrate=true;" << std::endl
939 <<
"ranksep=0;" << std::endl
940 <<
"nodesep=0;" << std::endl
941 <<
"size=\"8,10\";" << std::endl
942 <<
"node [fontsize=20,shape=plaintext];" << std::endl;
944 for (std::list<std::string>::iterator iFile = listFilesToParse.begin();
945 iFile != listFilesToParse.end(); ++iFile) {
946 std::ifstream in(filesToParse[*iFile].c_str());
948 while (in && !in.eof()) {
949 std::getline(in, line);
951 while (line[pos] ==
' ' || line[pos] ==
'\t') ++pos;
952 if (line[pos] !=
'#')
continue;
954 while (line[pos] ==
' ' || line[pos] ==
'\t') ++pos;
955 if (line.compare(pos, 8,
"include ") != 0)
continue;
957 while (line[pos] ==
' ' || line[pos] ==
'\t') ++pos;
958 if (line[pos] !=
'"' && line[pos] !=
'<')
960 char delim = line[pos];
961 if (delim ==
'<') delim =
'>';
965 pos = line.find(delim);
966 if (pos == std::string::npos)
continue;
968 if (filesToParse.find(line) == filesToParse.end()) {
972 listFilesToParse.push_back(line);
973 filesToParse[
line] = sysfilename;
974 if (*iFile == implFileName.
Data() || *iFile == declFileName.
Data())
975 outdot <<
"\"" << *iFile <<
"\" [style=filled,fillcolor=lightgray];" << std::endl;
977 outdot <<
"\"" << *iFile <<
"\" -> \"" << line <<
"\";" << std::endl;
981 outdot <<
"}" << std::endl;
993 std::ofstream outdot(filename);
994 outdot <<
"strict digraph G {" << std::endl
995 <<
"ratio=auto;" << std::endl
996 <<
"rankdir=RL;" << std::endl
997 <<
"compound=true;" << std::endl
998 <<
"constraint=false;" << std::endl
999 <<
"ranksep=0.7;" << std::endl
1000 <<
"nodesep=0.3;" << std::endl
1001 <<
"size=\"8,8\";" << std::endl
1002 <<
"ratio=compress;" << std::endl;
1005 outdot <<
"\"All Libraries\" [URL=\"LibraryDependencies.html\",shape=box,rank=max,fillcolor=lightgray,style=filled];" << std::endl;
1007 if (libs.Length()) {
1017 if (posExt !=
kNPOS)
1021 outdot <<
"\"All Libraries\" -> \"" << firstLib <<
"\" [style=invis];" << std::endl;
1022 outdot <<
"\"" << firstLib <<
"\" -> {" << std::endl;
1024 if (firstLib !=
"libCore")
1026 if (firstLib !=
"libCint")
1029 for (
Ssiz_t pos = 0; pos < libs.Length(); ++pos)
1030 if (libs[pos] !=
' ')
1031 thisLib += libs[pos];
1032 else if (thisLib.
Length()) {
1034 if (posExt !=
kNPOS)
1036 outdot <<
" \"" << thisLib <<
"\";";
1042 if (posExt !=
kNPOS)
1044 outdot <<
" \"" << thisLib <<
"\";";
1047 outdot <<
"}" << std::endl;
1049 outdot <<
"\"No rlibmap information available.\"" << std::endl;
1051 outdot <<
"}" << std::endl;
1065 if (!bases || bases->
IsEmpty())
1068 out <<
"<hr />" << std::endl;
1070 out <<
"<table><tr><td><ul><li><tt>";
1073 << docFileName <<
"\">";
1081 out <<
"</tt></li></ul></td>";
1085 out <<
"</tr></table>" << std::endl;
1097 const char* title =
"ClassHierarchy";
1102 std::ofstream dotout(filename +
".dot");
1104 if (!dotout.good()) {
1105 Error(
"CreateHierarchy",
"Can't open file '%s.dot' !",
1110 dotout <<
"digraph G {" << std::endl
1111 <<
"ratio=auto;" << std::endl
1112 <<
"rankdir=RL;" << std::endl;
1123 Warning(
"THtml::CreateHierarchy",
"skipping class %s\n", cdi->
GetName());
1129 if (bases && !bases->
IsEmpty()) {
1130 dotout <<
"\"" << cdi->
GetName() <<
"\" -> { ";
1135 if (base != bases->
First())
1137 dotout <<
"\"" << base->
GetName() <<
"\"";
1139 dotout <<
"};" << std::endl;
1142 dotout <<
"\"" << cdi->
GetName() <<
"\";" << std::endl;
1149 std::ofstream out(filename +
".html");
1151 Error(
"CreateHierarchy",
"Can't open file '%s.html' !",
1159 out <<
"<h1>Class Hierarchy</h1>" << std::endl;
1165 out <<
"<img usemap=\"#Map" << title <<
"\" src=\"" << title <<
".png\"/>" << std::endl;
1191 dynamic_cast<std::ofstream&
>(out).
open(sourceHtmlFileName);
1193 Warning(
"LocateMethodsInSource",
"Can't open beautified source file '%s' for writing!",
1194 sourceHtmlFileName.
Data());
1195 sourceHtmlFileName.
Remove(0);
1201 title +=
" - source file";
1203 out <<
"<div id=\"codeAndLineNumbers\"><pre class=\"listing\">" << std::endl;
1214 out <<
"<td></td>" << std::endl;
1225 if (!classPtr)
continue;
1229 if (!bases)
continue;
1232 if (!inheritFrom)
continue;
1235 out <<
"<td>←</td><td><table><tr>" << std::endl;
1237 out <<
"</tr><tr>"<<std::endl;
1240 UInt_t bgcolor=255-depth*8;
1241 out <<
"<td bgcolor=\"" 1242 <<
Form(
"#%02x%02x%02x", bgcolor, bgcolor, bgcolor)
1244 out <<
"<table><tr><td>" << std::endl;
1247 if (htmlFile.Length()) {
1248 out <<
"<center><tt><a name=\"" << cdi->
GetName() <<
"\" href=\"" 1249 << htmlFile <<
"\">";
1251 out <<
"</a></tt></center>";
1270 out <<
"</td>" << std::endl;
1272 out <<
"</tr></table></td>" << std::endl;
1276 out <<
"</tr></table></td>" << std::endl;
1278 out <<
"<td></td>" << std::endl;
1303 if (!htmlFile.
Length()) {
1305 what +=
" (source not found)";
1321 Error(
"MakeTree",
"Cannot create a TCanvas!");
1343 out <<
"<div class=\"dropshadow\"><div class=\"withshadow\">";
1346 out <<
"<h1><a name=\"" << anchor;
1347 out <<
":description\"></a>";
1350 out <<
"namespace ";
1361 while ((inheritFrom = (
TBaseClass *) nextBase())) {
1371 out <<
"protected ";
1383 out <<
"<a href=\"" << htmlFile <<
"\">";
1389 out <<
"</h1>" << std::endl;
1391 out <<
"<div class=\"classdescr\">" << std::endl;
1393 if (description.
Length())
1394 out <<
"<pre>" << description <<
"</pre>";
1398 out <<
"<h4>This class is also known as (typedefs to this class)</h4>";
1400 bool firsttd =
true;
1405 else firsttd =
false;
1410 out <<
"</div>" << std::endl
1411 <<
"</div></div>" << std::endl;
1417 out <<
"<h2><a id=\"" << anchor
1418 <<
":Class_Charts\"></a>Class Charts</h2>" << std::endl;
1424 out <<
"<h2>Function documentation</h2>" << std::endl;
1433 classFile <<
"<a name=\"TopOfPage\"></a>" << std::endl;
1441 sTitle.Prepend(
"namespace ");
1443 sTitle.Prepend(
"class ");
1450 char* libDup=
StrDup(lib);
1451 char* libDupSpace=strchr(libDup,
' ');
1452 if (libDupSpace) *libDupSpace=0;
1453 char* libDupEnd=libDup+strlen(libDup);
1454 while (libDupEnd!=libDup)
1455 if (*(--libDupEnd)==
'.') {
1462 classFile <<
"<script type=\"text/javascript\">WriteFollowPageBox('" 1463 << sTitle <<
"','" << sLib <<
"','" << sInclude <<
"');</script>" << std::endl;
1470 classFile <<
"<div class=\"descrhead\"><div class=\"descrheadcontent\">" << std::endl
1471 <<
"<span class=\"descrtitle\">Source:</span>" << std::endl;
1481 if (headerFileName.
Length())
1482 classFile <<
"<a class=\"descrheadentry\" href=\"src/" << classFileName
1483 <<
".h.html\">header file</a>" << std::endl;
1485 classFile <<
"<a class=\"descrheadentry\"> </a>" << std::endl;
1487 if (sourceFileName.
Length())
1488 classFile <<
"<a class=\"descrheadentry\" href=\"src/" << classFileName
1489 <<
".cxx.html\">source file</a>" << std::endl;
1491 classFile <<
"<a class=\"descrheadentry\"> </a>" << std::endl;
1495 classFile <<
"<a class=\"descrheadentry\" href=\"" << classFileName <<
"_Tree.pdf\"";
1496 classFile <<
">inheritance tree (.pdf)</a> ";
1501 if (viewCVSLink.
Length()) {
1502 if (headerFileName.
Length()) {
1504 TString sHeader(headerFileName);
1505 if (
GetHtml()->GetProductName() && !strcmp(
GetHtml()->GetProductName(),
"ROOT")) {
1507 if (posInclude !=
kNPOS) {
1509 sHeader.
Remove(0, posInclude + 8);
1512 posInclude = sHeader.
Index(
"/inc/");
1513 if (posInclude !=
kNPOS) {
1515 sHeader += sInclude;
1518 if (sourceFileName && strstr(sourceFileName,
"src")) {
1526 if (posEndLib !=
kNPOS)
1527 src.Remove(posEndLib, src.Length());
1528 if (src.BeginsWith(
"lib"))
1530 posEndLib = src.Index(
'.');
1531 if (posEndLib !=
kNPOS)
1532 src.Remove(posEndLib, src.Length());
1540 if (mustReplace) link.
ReplaceAll(
"%f", sHeader);
1541 else link += sHeader;
1542 classFile <<
"<a class=\"descrheadentry\" href=\"" << link <<
"\">viewVC header</a> ";
1544 classFile <<
"<a class=\"descrheadentry\"> </a> ";
1545 if (sourceFileName.
Length()) {
1547 if (mustReplace) link.
ReplaceAll(
"%f", sourceFileName);
1548 else link += sourceFileName;
1549 classFile <<
"<a class=\"descrheadentry\" href=\"" << link <<
"\">viewVC source</a> ";
1551 classFile <<
"<a class=\"descrheadentry\"> </a> ";
1560 else wikiLink += currClassNameMangled;
1561 classFile <<
"<a class=\"descrheadentry\" href=\"" << wikiLink <<
"\">wiki</a> ";
1564 classFile << std::endl <<
"</div></div>" << std::endl;
1566 classFile <<
"<div class=\"descrhead\"><div class=\"descrheadcontent\">" << std::endl
1567 <<
"<span class=\"descrtitle\">Sections:</span>" << std::endl
1568 <<
"<a class=\"descrheadentry\" href=\"#" << currClassNameMangled;
1570 classFile <<
":description\">namespace description</a> ";
1572 classFile <<
":description\">class description</a> ";
1573 classFile << std::endl
1574 <<
"<a class=\"descrheadentry\" href=\"#" << currClassNameMangled <<
":Function_Members\">function members</a>" << std::endl
1575 <<
"<a class=\"descrheadentry\" href=\"#" << currClassNameMangled <<
":Data_Members\">data members</a>" << std::endl
1576 <<
"<a class=\"descrheadentry\" href=\"#" << currClassNameMangled <<
":Class_Charts\">class charts</a>" << std::endl
1577 <<
"</div></div>" << std::endl
1578 <<
"</div>" << std::endl;
1593 const char* filename,
TString& anchor,
1598 out <<
"<div class=\"funcdoc\"><span class=\"funcname\">" 1599 << ret <<
" <a class=\"funcname\" name=\"";
1602 out << mangled <<
":";
1609 out << mangled <<
"\" href=\"src/" << filename;
1611 out <<
"#" << anchor;
1615 if (guessedMethod) {
1621 if (!first) out <<
", ";
1624 paramGuessed +=
" ";
1625 paramGuessed += arg->
GetName();
1627 paramGuessed +=
" = ";
1631 out << paramGuessed;
1640 out <<
"</span><br />" << std::endl;
1643 out <<
"<div class=\"funccomm\"><pre>" << comment <<
"</pre></div>" << std::endl;
1645 if (codeOneLiner.
Length()) {
1646 out << std::endl <<
"<div class=\"code\"><code class=\"inlinecode\">" 1647 << codeOneLiner <<
"</code></div>" << std::endl
1648 <<
"<div style=\"clear:both;\"></div>" << std::endl;
1651 out <<
"</div>" << std::endl;
A zero length substring is legal.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual const char * GetName() const
Returns name of object.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
static Bool_t IsNamespace(const TClass *cl)
Check whether cl is a namespace.
TClassDocOutput(THtml &html, TClass *cl, TList *typedefs)
Create an object given the invoking THtml object, and the TClass object that we will generate output ...
virtual Bool_t IsAbsoluteFileName(const char *dir)
Return true if dir is an absolute pathname.
virtual void Close(Option_t *option="")=0
TList * GetListOfBases()
Return list containing the TBaseClass(es) of a class.
virtual ~TClassDocOutput()
Destructor, deletes fParser.
virtual bool GetImplFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return implementation file name.
Bool_t HaveDot()
Check whether dot is available in $PATH or in the directory set by SetDotPath()
R__EXTERN Int_t gErrorIgnoreLevel
void CreateClassHierarchy(std::ostream &out, const char *docFileName)
Create the hierarchical class list part for the current class's base classes.
const TString & GetWikiURL() const
const char * GetFullTypeName() const
Get full type description of data member, e,g.: "class TDirectory*".
const char * GetReturnTypeName() const
Get full type description of function return type, e,g.: "class TDirectory*".
All ROOT classes may have RTTI (run time type identification) support added.
TString & ReplaceAll(const TString &s1, const TString &s2)
const char * GetTypeName() const
Get type of data member, e,g.: "class TDirectory*" -> "TDirectory".
virtual Int_t GetEntries() const
virtual int MakeDirectory(const char *name)
Make a directory.
void ClassTree(TVirtualPad *canvas, Bool_t force=kFALSE)
It makes a graphical class tree.
TList * GetListOfDataMembers(Bool_t load=kTRUE)
Return list containing the TDataMembers of a class.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
const TList * GetEnums(EAccess access) const
const char * GetSharedLibs()
Get the list of shared libraries containing the code for class cls.
const TString & GetViewCVS() const
Bool_t CopyHtmlFile(const char *sourceName, const char *destName="")
Copy file to HTML directory.
Each ROOT method (see TMethod) has a linked list of its arguments.
TString & Prepend(const char *cs)
const char * GetFullTypeName() const
Get full type description of method argument, e.g.: "class TDirectory*".
virtual Int_t GetOverloadIdx() const =0
const char * GetSourceInfo(ESourceInfo type) const
const char * GetCounter() const
void GetDerivedClasses(TClass *cl, std::map< TClass *, Int_t > &derived) const
fill derived with all classes inheriting from cl and their inheritance distance to cl ...
const TList * GetListOfClasses() const
virtual TObject * FindObject(const char *name) const
Delete a TObjLink object.
void MakeTree(Bool_t force=kFALSE)
Create an output file with a graphical representation of the class inheritance.
virtual void SaveAs(const char *filename="", Option_t *option="") const =0
Save this object in the file specified by filename.
Bool_t CreateHierarchyDot()
Create a hierarchical class list The algorithm descends from the base classes and branches into all d...
const TList * GetMethods(EAccess access) const
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
virtual bool GetFileNameFromInclude(const char *included, TString &out_fsname) const
Set out_fsname to the full pathname corresponding to a file included as "included".
Ssiz_t First(char c) const
Find first occurrence of a character c.
Bool_t CreateDotClassChartInh(const char *filename)
Build the class tree for one class in GraphViz/Dot format.
void WriteHtmlFooter(std::ostream &out, const char *dir, const char *lastUpdate, const char *author, const char *copyright, const char *footer)
Write HTML footer.
void WriteLocation(std::ostream &out, TModuleDocInfo *module, const char *classname=0)
make a link to the description
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual void GetModuleNameForClass(TString &module, TClass *cl) const
Return the module name for a given class.
TDictionary * GetClass() const
virtual void Parse(std::ostream &out)
Locate methods, starting in the source file, then inline, then immediately inside the class declarati...
Int_t GetMaxIndex(Int_t dim) const
Return maximum index for array dimension "dim".
virtual bool GetIncludeAs(TClass *cl, TString &out_include_as) const
Determine the path and filename used in an include statement for the header file of the given class...
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();...
virtual TObject * First() const
Return the first object in the list. Returns 0 when list is empty.
virtual const char * GetName() const
Returns name of object.
R__EXTERN TSystem * gSystem
Basic data type descriptor (datatype information is obtained from CINT).
virtual const char * ReplaceSpecialChars(char c)
Replace ampersand, less-than and greater-than character, writing to out.
This class defines an abstract interface that must be implemented by all classes that contain diction...
virtual void NameSpace2FileName(TString &name)
Replace "::" in name by "__" Replace "<", ">", " ", ",", "~", "=" in name by "_" Replace "A::X<A::Y>"...
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
void CreateSourceOutputStream(std::ostream &out, const char *extension, TString &filename)
Open a Class.cxx.html file, where Class is defined by classPtr, and .cxx.html by extension It's creat...
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
char * Form(const char *fmt,...)
void Draw(Option_t *option="")
Draw detailed class inheritance structure.
const char * ShortType(const char *name) const
Get short type name, i.e. with default templates removed.
const TString & GetOutputDir(Bool_t createDir=kTRUE) const
Return the output directory as set by SetOutputDir().
Int_t GetArrayDim() const
Return number of array dimensions.
The ROOT global object gROOT contains a list of all defined classes.
virtual TMethod * GetMethod() const =0
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
TList * fCurrentClassesTypedefs
virtual bool GetDeclFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return declaration file name; return the full path if filesys is true.
virtual void WriteSearch(std::ostream &out)
Write a search link or a search box, based on THtml::GetSearchStemURL() and THtml::GetSearchEngine()...
Long_t Property() const
Set TObject::fBits and fStreamerType to cache information about the class.
void DescendHierarchy(std::ostream &out, TClass *basePtr, Int_t maxLines=0, Int_t depth=1)
Descend hierarchy recursively loop over all classes and look for classes with base class basePtr...
Each class (see TClass) has a linked list of its base class(es).
void WriteHtmlHeader(std::ostream &out, const char *titleNoSpecial, const char *dir, TClass *cls, const char *header)
Write HTML header.
virtual Bool_t IsModified(TClass *classPtr, EFileType type)
Check if file is modified.
const char * GetHtmlFileName() const
char * StrDup(const char *str)
Duplicate the string str.
void ClassHtmlTree(std::ostream &out, TClass *classPtr, ETraverse dir=kBoth, int depth=1)
This function builds the class tree for one class in HTML (inherited and succeeding classes...
TString & Remove(Ssiz_t pos)
void Class2Html(Bool_t force=kFALSE)
Create HTML files for a single class.
const char * GetCounterFormat() const
virtual Bool_t IsEmpty() const
Ssiz_t Last(char c) const
Find last occurrence of a character c.
virtual void DecorateKeywords(std::ostream &out, const char *text)
Expand keywords in text, writing to out.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
#define R__LOCKGUARD(mutex)
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
virtual void GetHtmlFileName(TClass *classPtr, TString &filename) const
Return real HTML filename.
virtual void ListDataMembers(std::ostream &classFile)
Write the list of data members and enums.
virtual TClass * GetClass(const char *name) const
Return pointer to class with name.
void WriteTopLinks(std::ostream &out, TModuleDocInfo *module, const char *classname=0, Bool_t withLocation=kTRUE)
Write the first part of the links shown ontop of each doc page; one <div> has to be closed by caller ...
virtual void WriteClassDocHeader(std::ostream &classFile)
Write out the introduction of a class description (shortcuts and links)
const char * GetDefault() const
Get default value of method argument.
Bool_t CreateDotClassChartInhMem(const char *filename)
Build the class tree of inherited members for one class in GraphViz/Dot format.
Bool_t RunDot(const char *filename, std::ostream *outMap=0, EGraphvizTool gvwhat=kDot)
Run filename".dot", creating filename".png", and - if outMap is !=0, filename".map", which gets then included literally into outMap.
Each ROOT class (see TClass) has a linked list of methods.
TClass * GetClass() const
virtual void WriteMethod(std::ostream &out, TString &ret, TString &name, TString ¶ms, const char *file, TString &anchor, TString &comment, TString &codeOneLiner, TDocMethodWrapper *guessedMethod)
Write method name with return type ret and parameters param to out.
Bool_t ClassDotCharts(std::ostream &out)
This function builds the class charts for one class in GraphViz/Dot format, i.e.
TMethod * GetMethodAny(const char *method)
Return pointer to method without looking at parameters.
const TList * GetListOfModules() const
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
const TPathDefinition & GetPathDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
virtual void ListFunctions(std::ostream &classFile)
Write the list of functions.
TClass * GetClass() const
Bool_t CreateDotClassChartIncl(const char *filename)
Build the include dependency graph for one class in GraphViz/Dot format.
TList * GetListOfMethods(Bool_t load=kTRUE)
Return list containing the TMethods of a class.
virtual void WriteClassDescription(std::ostream &out, const TString &description)
Called by TDocParser::LocateMethods(), this hook writes out the class description found by TDocParser...
Bool_t CreateDotClassChartLib(const char *filename)
Build the library dependency graph for one class in GraphViz/Dot format.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual const char * GetTitle() const
Returns title of object.
const TList * GetDataMembers(EAccess access) const
const char * Data() const