|
Packit |
1c1d7e |
#include "md5.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "dirdef.h"
|
|
Packit |
1c1d7e |
#include "filename.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "outputlist.h"
|
|
Packit |
1c1d7e |
#include "language.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "dot.h"
|
|
Packit |
1c1d7e |
#include "layout.h"
|
|
Packit |
1c1d7e |
#include "ftextstream.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "docparser.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------
|
|
Packit |
1c1d7e |
// method implementation
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int g_dirCount=0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DirDef::DirDef(const char *path) : Definition(path,1,1,path), visited(FALSE)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
|
|
Packit |
1c1d7e |
// get display name (stipping the paths mentioned in STRIP_FROM_PATH)
|
|
Packit |
1c1d7e |
// get short name (last part of path)
|
|
Packit |
1c1d7e |
m_shortName = path;
|
|
Packit |
1c1d7e |
m_diskName = path;
|
|
Packit |
1c1d7e |
if (m_shortName.at(m_shortName.length()-1)=='/')
|
|
Packit |
1c1d7e |
{ // strip trailing /
|
|
Packit |
1c1d7e |
m_shortName = m_shortName.left(m_shortName.length()-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int pi=m_shortName.findRev('/');
|
|
Packit |
1c1d7e |
if (pi!=-1)
|
|
Packit |
1c1d7e |
{ // remove everything till the last /
|
|
Packit |
1c1d7e |
m_shortName = m_shortName.mid(pi+1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
setLocalName(m_shortName);
|
|
Packit |
1c1d7e |
m_dispName = fullPathNames ? stripFromPath(path) : m_shortName;
|
|
Packit |
1c1d7e |
if (m_dispName.length()>0 && m_dispName.at(m_dispName.length()-1)=='/')
|
|
Packit |
1c1d7e |
{ // strip trailing /
|
|
Packit |
1c1d7e |
m_dispName = m_dispName.left(m_dispName.length()-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_fileList = new FileList;
|
|
Packit |
1c1d7e |
m_usedDirs = new QDict<UsedDir>(257);
|
|
Packit |
1c1d7e |
m_usedDirs->setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
m_dirCount = g_dirCount++;
|
|
Packit |
1c1d7e |
m_level=-1;
|
|
Packit |
1c1d7e |
m_parent=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DirDef::~DirDef()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete m_fileList;
|
|
Packit |
1c1d7e |
delete m_usedDirs;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool DirDef::isLinkableInProject() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return !isReference();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool DirDef::isLinkable() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return isReference() || isLinkableInProject();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::addSubDir(DirDef *subdir)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_subdirs.append(subdir);
|
|
Packit |
1c1d7e |
subdir->setOuterScope(this);
|
|
Packit |
1c1d7e |
subdir->m_parent=this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::addFile(FileDef *fd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_fileList->append(fd);
|
|
Packit |
1c1d7e |
fd->setDirDef(this);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::sort()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_subdirs.sort();
|
|
Packit |
1c1d7e |
m_fileList->sort();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString encodeDirName(const QCString &anchor)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// convert to md5 hash
|
|
Packit |
1c1d7e |
uchar md5_sig[16];
|
|
Packit |
1c1d7e |
QCString sigStr(33);
|
|
Packit |
1c1d7e |
MD5Buffer((const unsigned char *)anchor.data(),anchor.length(),md5_sig);
|
|
Packit |
1c1d7e |
MD5SigToString(md5_sig,sigStr.rawData(),33);
|
|
Packit |
1c1d7e |
return sigStr;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// old algorithm
|
|
Packit |
1c1d7e |
// QCString result;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// int l = anchor.length(),i;
|
|
Packit |
1c1d7e |
// for (i=0;i
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// char c = anchor.at(i);
|
|
Packit |
1c1d7e |
// if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// result+=c;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// else
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// static char hexStr[]="0123456789ABCDEF";
|
|
Packit |
1c1d7e |
// char escChar[]={ '_', 0, 0, 0 };
|
|
Packit |
1c1d7e |
// escChar[1]=hexStr[c>>4];
|
|
Packit |
1c1d7e |
// escChar[2]=hexStr[c&0xf];
|
|
Packit |
1c1d7e |
// result+=escChar;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString DirDef::getOutputFileBase() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("DirDef::getOutputFileBase() %s->dir_%s\n",
|
|
Packit |
1c1d7e |
// m_diskName.data(),encodeDirName(m_diskName).data());
|
|
Packit |
1c1d7e |
return "dir_"+encodeDirName(m_diskName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF)) ||
|
|
Packit |
1c1d7e |
!documentation().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.writeRuler();
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.writeAnchor(0,"details");
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
ol.startGroupHeader();
|
|
Packit |
1c1d7e |
ol.parseText(title);
|
|
Packit |
1c1d7e |
ol.endGroupHeader();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// repeat brief description
|
|
Packit |
1c1d7e |
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// separator between brief and details
|
|
Packit |
1c1d7e |
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
|
|
Packit |
1c1d7e |
!documentation().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
// ol.newParagraph(); // FIXME:PARA
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
ol.enable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
ol.writeString("\n\n");
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write documentation
|
|
Packit |
1c1d7e |
if (!documentation().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::writeBriefDescription(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (hasBriefDescription())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocRoot *rootNode = validatingParseDoc(
|
|
Packit |
1c1d7e |
briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
|
|
Packit |
1c1d7e |
if (rootNode && !rootNode->isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startParagraph();
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
ol.writeString(" - ");
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
ol.writeDoc(rootNode,this,0);
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
ol.writeString(" \n");
|
|
Packit |
1c1d7e |
ol.enable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (Config_getBool(REPEAT_BRIEF) ||
|
|
Packit |
1c1d7e |
!documentation().isEmpty()
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.startTextLink(0,"details");
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trMore());
|
|
Packit |
1c1d7e |
ol.endTextLink();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.endParagraph();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
delete rootNode;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.writeSynopsis();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::writeDirectoryGraph(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// write graph dependency graph
|
|
Packit |
1c1d7e |
if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DotDirDeps dirDep(this);
|
|
Packit |
1c1d7e |
if (!dirDep.isTrivial())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating dependency graph for directory %s\n",displayName().data());
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
//ol.startParagraph();
|
|
Packit |
1c1d7e |
ol.startDirDepGraph();
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trDirDepGraph(shortName()));
|
|
Packit |
1c1d7e |
ol.endDirDepGraph(dirDep);
|
|
Packit |
1c1d7e |
//ol.endParagraph();
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::writeSubDirList(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int numSubdirs = 0;
|
|
Packit |
1c1d7e |
QListIterator<DirDef> it(m_subdirs);
|
|
Packit |
1c1d7e |
DirDef *dd;
|
|
Packit |
1c1d7e |
for (it.toFirst();(dd=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (dd->hasDocumentation() || dd->getFiles()->count()>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
numSubdirs++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write subdir list
|
|
Packit |
1c1d7e |
if (numSubdirs>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startMemberHeader("subdirs");
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trDir(TRUE,FALSE));
|
|
Packit |
1c1d7e |
ol.endMemberHeader();
|
|
Packit |
1c1d7e |
ol.startMemberList();
|
|
Packit |
1c1d7e |
for (it.toFirst();(dd=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (dd->hasDocumentation() || dd->getFiles()->count()==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startMemberDeclaration();
|
|
Packit |
1c1d7e |
ol.startMemberItem(dd->getOutputFileBase(),0);
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trDir(FALSE,TRUE)+" ");
|
|
Packit |
1c1d7e |
ol.insertMemberAlign();
|
|
Packit |
1c1d7e |
ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName());
|
|
Packit |
1c1d7e |
ol.endMemberItem();
|
|
Packit |
1c1d7e |
if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startMemberDescription(dd->getOutputFileBase());
|
|
Packit |
1c1d7e |
ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
|
|
Packit |
1c1d7e |
FALSE, // indexWords
|
|
Packit |
1c1d7e |
FALSE, // isExample
|
|
Packit |
1c1d7e |
0, // exampleName
|
|
Packit |
1c1d7e |
TRUE, // single line
|
|
Packit |
1c1d7e |
TRUE // link from index
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
ol.endMemberDescription();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.endMemberDeclaration(0,0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.endMemberList();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::writeFileList(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int numFiles = 0;
|
|
Packit |
1c1d7e |
QListIterator<FileDef> it(*m_fileList);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (it.toFirst();(fd=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (fd->hasDocumentation())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
numFiles++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write file list
|
|
Packit |
1c1d7e |
if (numFiles>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startMemberHeader("files");
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trFile(TRUE,FALSE));
|
|
Packit |
1c1d7e |
ol.endMemberHeader();
|
|
Packit |
1c1d7e |
ol.startMemberList();
|
|
Packit |
1c1d7e |
QListIterator<FileDef> it(*m_fileList);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (;(fd=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (fd->hasDocumentation())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startMemberDeclaration();
|
|
Packit |
1c1d7e |
ol.startMemberItem(fd->getOutputFileBase(),0);
|
|
Packit |
1c1d7e |
ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
|
|
Packit |
1c1d7e |
ol.insertMemberAlign();
|
|
Packit |
1c1d7e |
if (fd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startBold();
|
|
Packit |
1c1d7e |
ol.docify(fd->name());
|
|
Packit |
1c1d7e |
ol.endBold();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (fd->generateSourceFile())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.docify(" ");
|
|
Packit |
1c1d7e |
ol.startTextLink(fd->includeName(),0);
|
|
Packit |
1c1d7e |
ol.docify("[");
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trCode());
|
|
Packit |
1c1d7e |
ol.docify("]");
|
|
Packit |
1c1d7e |
ol.endTextLink();
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.endMemberItem();
|
|
Packit |
1c1d7e |
if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startMemberDescription(fd->getOutputFileBase());
|
|
Packit |
1c1d7e |
ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
|
|
Packit |
1c1d7e |
FALSE, // indexWords
|
|
Packit |
1c1d7e |
FALSE, // isExample
|
|
Packit |
1c1d7e |
0, // exampleName
|
|
Packit |
1c1d7e |
TRUE, // single line
|
|
Packit |
1c1d7e |
TRUE // link from index
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
ol.endMemberDescription();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.endMemberDeclaration(0,0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.endMemberList();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::startMemberDeclarations(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startMemberSections();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::endMemberDeclarations(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.endMemberSections();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString DirDef::shortTitle() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return theTranslator->trDirReference(m_shortName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool DirDef::hasDetailedDescription() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool repeatBrief = Config_getBool(REPEAT_BRIEF);
|
|
Packit |
1c1d7e |
return (!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::writeTagFile(FTextStream &tagFile)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tagFile << " <compound kind=\"dir\">" << endl;
|
|
Packit |
1c1d7e |
tagFile << " <name>" << convertToXML(displayName()) << "</name>" << endl;
|
|
Packit |
1c1d7e |
tagFile << " <path>" << convertToXML(name()) << "</path>" << endl;
|
|
Packit |
1c1d7e |
tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
|
|
Packit |
1c1d7e |
QListIterator<LayoutDocEntry> eli(
|
|
Packit |
1c1d7e |
LayoutDocManager::instance().docEntries(LayoutDocManager::Directory));
|
|
Packit |
1c1d7e |
LayoutDocEntry *lde;
|
|
Packit |
1c1d7e |
for (eli.toFirst();(lde=eli.current());++eli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch (lde->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case LayoutDocEntry::DirSubDirs:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_subdirs.count()>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *dd;
|
|
Packit |
1c1d7e |
QListIterator<DirDef> it(m_subdirs);
|
|
Packit |
1c1d7e |
for (;(dd=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::DirFiles:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_fileList->count()>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<FileDef> it(*m_fileList);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (;(fd=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
writeDocAnchorsToTagFile(tagFile);
|
|
Packit |
1c1d7e |
tagFile << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::writeDocumentation(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString title=theTranslator->trDirReference(m_dispName);
|
|
Packit |
1c1d7e |
startFile(ol,getOutputFileBase(),name(),title,HLI_Files,!generateTreeView);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!generateTreeView)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// write navigation path
|
|
Packit |
1c1d7e |
writeNavigationPath(ol);
|
|
Packit |
1c1d7e |
ol.endQuickIndices();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
startTitle(ol,getOutputFileBase());
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.parseText(shortTitle());
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.parseText(title);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
endTitle(ol,getOutputFileBase(),title);
|
|
Packit |
1c1d7e |
ol.startContents();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//---------------------------------------- start flexible part -------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
SrcLangExt lang = getLanguage();
|
|
Packit |
1c1d7e |
QListIterator<LayoutDocEntry> eli(
|
|
Packit |
1c1d7e |
LayoutDocManager::instance().docEntries(LayoutDocManager::Directory));
|
|
Packit |
1c1d7e |
LayoutDocEntry *lde;
|
|
Packit |
1c1d7e |
for (eli.toFirst();(lde=eli.current());++eli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch (lde->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case LayoutDocEntry::BriefDesc:
|
|
Packit |
1c1d7e |
writeBriefDescription(ol);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::DirGraph:
|
|
Packit |
1c1d7e |
writeDirectoryGraph(ol);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::MemberDeclStart:
|
|
Packit |
1c1d7e |
startMemberDeclarations(ol);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::DirSubDirs:
|
|
Packit |
1c1d7e |
writeSubDirList(ol);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::DirFiles:
|
|
Packit |
1c1d7e |
writeFileList(ol);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::MemberDeclEnd:
|
|
Packit |
1c1d7e |
endMemberDeclarations(ol);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::DetailedDesc:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
|
|
Packit |
1c1d7e |
writeDetailedDescription(ol,ls->title(lang));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case LayoutDocEntry::ClassIncludes:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::ClassInlineClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::ClassInheritanceGraph:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::ClassNestedClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::ClassCollaborationGraph:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::ClassAllMembersLink:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::ClassUsedFiles:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::NamespaceNestedNamespaces:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::NamespaceNestedConstantGroups:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::NamespaceClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::NamespaceInlineClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileNamespaces:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileConstantGroups:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileIncludes:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileIncludeGraph:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileIncludedByGraph:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileSourceLink:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::FileInlineClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupInlineClasses:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupNamespaces:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupDirs:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupNestedGroups:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupFiles:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupGraph:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::GroupPageDocs:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::AuthorSection:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::MemberGroups:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::MemberDecl:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::MemberDef:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::MemberDefStart:
|
|
Packit |
1c1d7e |
case LayoutDocEntry::MemberDefEnd:
|
|
Packit |
1c1d7e |
err("Internal inconsistency: member %d should not be part of "
|
|
Packit |
1c1d7e |
"LayoutDocManager::Directory entry list\n",lde->kind());
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//---------------------------------------- end flexible part -------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.endContents();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
endFileWithNavPath(this,ol);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirDef::setLevel()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_level==-1) // level not set before
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *p = parent();
|
|
Packit |
1c1d7e |
if (p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
p->setLevel();
|
|
Packit |
1c1d7e |
m_level = p->level()+1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_level = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Add as "uses" dependency between \a this dir and \a dir,
|
|
Packit |
1c1d7e |
* that was caused by a dependency on file \a fd.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void DirDef::addUsesDependency(DirDef *dir,FileDef *srcFd,
|
|
Packit |
1c1d7e |
FileDef *dstFd,bool inherited)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (this==dir) return; // do not add self-dependencies
|
|
Packit |
1c1d7e |
//static int count=0;
|
|
Packit |
1c1d7e |
//printf(" %d add dependency %s->%s due to %s->%s\n",
|
|
Packit |
1c1d7e |
// count++,shortName().data(),
|
|
Packit |
1c1d7e |
// dir->shortName().data(),
|
|
Packit |
1c1d7e |
// srcFd->name().data(),
|
|
Packit |
1c1d7e |
// dstFd->name().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// levels match => add direct dependency
|
|
Packit |
1c1d7e |
bool added=FALSE;
|
|
Packit |
1c1d7e |
UsedDir *usedDir = m_usedDirs->find(dir->getOutputFileBase());
|
|
Packit |
1c1d7e |
if (usedDir) // dir dependency already present
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FilePair *usedPair = usedDir->findFilePair(
|
|
Packit |
1c1d7e |
srcFd->getOutputFileBase()+dstFd->getOutputFileBase());
|
|
Packit |
1c1d7e |
if (usedPair==0) // new file dependency
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" => new file\n");
|
|
Packit |
1c1d7e |
usedDir->addFileDep(srcFd,dstFd);
|
|
Packit |
1c1d7e |
added=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// dir & file dependency already added
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // new directory dependency
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" => new file\n");
|
|
Packit |
1c1d7e |
usedDir = new UsedDir(dir,inherited);
|
|
Packit |
1c1d7e |
usedDir->addFileDep(srcFd,dstFd);
|
|
Packit |
1c1d7e |
m_usedDirs->insert(dir->getOutputFileBase(),usedDir);
|
|
Packit |
1c1d7e |
added=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (added)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (dir->parent())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// add relation to parent of used dir
|
|
Packit |
1c1d7e |
addUsesDependency(dir->parent(),srcFd,dstFd,inherited);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (parent())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// add relation for the parent of this dir as well
|
|
Packit |
1c1d7e |
parent()->addUsesDependency(dir,srcFd,dstFd,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Computes the dependencies between directories
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void DirDef::computeDependencies()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileList *fl = m_fileList;
|
|
Packit |
1c1d7e |
if (fl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<FileDef> fli(*fl);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (fli.toFirst();(fd=fli.current());++fli) // foreach file in dir dd
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" File %s\n",fd->name().data());
|
|
Packit |
1c1d7e |
//printf("** dir=%s file=%s\n",shortName().data(),fd->name().data());
|
|
Packit |
1c1d7e |
QList<IncludeInfo> *ifl = fd->includeFileList();
|
|
Packit |
1c1d7e |
if (ifl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<IncludeInfo> ifli(*ifl);
|
|
Packit |
1c1d7e |
IncludeInfo *ii;
|
|
Packit |
1c1d7e |
for (ifli.toFirst();(ii=ifli.current());++ifli) // foreach include file
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" > %s\n",ii->includeName.data());
|
|
Packit |
1c1d7e |
//printf(" #include %s\n",ii->includeName.data());
|
|
Packit |
1c1d7e |
if (ii->fileDef && ii->fileDef->isLinkable()) // linkable file
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *usedDir = ii->fileDef->getDirDef();
|
|
Packit |
1c1d7e |
if (usedDir)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// add dependency: thisDir->usedDir
|
|
Packit |
1c1d7e |
//static int count=0;
|
|
Packit |
1c1d7e |
//printf(" %d: add dependency %s->%s\n",count++,name().data(),usedDir->name().data());
|
|
Packit |
1c1d7e |
addUsesDependency(usedDir,fd,ii->fileDef,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_usedDirs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QDictIterator<UsedDir> udi(*m_usedDirs);
|
|
Packit |
1c1d7e |
UsedDir *udir;
|
|
Packit |
1c1d7e |
for (udi.toFirst();(udir=udi.current());++udi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
udir->sort();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool DirDef::isParentOf(DirDef *dir) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (dir->parent()==this) // this is a parent of dir
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
else if (dir->parent()) // repeat for the parent of dir
|
|
Packit |
1c1d7e |
return isParentOf(dir->parent());
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool DirDef::depGraphIsTrivial() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_usedDirs->count()==0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int FilePairDict::compareValues(const FilePair *left,const FilePair *right) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int orderHi = qstricmp(left->source()->name(),right->source()->name());
|
|
Packit |
1c1d7e |
if (orderHi!=0) return orderHi;
|
|
Packit |
1c1d7e |
int orderLo = qstricmp(left->destination()->name(),right->destination()->name());
|
|
Packit |
1c1d7e |
return orderLo;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
UsedDir::UsedDir(DirDef *dir,bool inherited) :
|
|
Packit |
1c1d7e |
m_dir(dir), m_filePairs(7), m_inherited(inherited)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_filePairs.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
UsedDir::~UsedDir()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void UsedDir::addFileDep(FileDef *srcFd,FileDef *dstFd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_filePairs.append(srcFd->getOutputFileBase()+dstFd->getOutputFileBase(),
|
|
Packit |
1c1d7e |
new FilePair(srcFd,dstFd));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void UsedDir::sort()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_filePairs.sort();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FilePair *UsedDir::findFilePair(const char *name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString n=name;
|
|
Packit |
1c1d7e |
return n.isEmpty() ? 0 : m_filePairs.find(n);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DirDef *DirDef::createNewDir(const char *path)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ASSERT(path!=0);
|
|
Packit |
1c1d7e |
DirDef *dir = Doxygen::directories->find(path);
|
|
Packit |
1c1d7e |
if (dir==0) // new dir
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Adding new dir %s\n",path);
|
|
Packit |
1c1d7e |
dir = new DirDef(path);
|
|
Packit |
1c1d7e |
//printf("createNewDir %s short=%s\n",path,dir->shortName().data());
|
|
Packit |
1c1d7e |
Doxygen::directories->append(path,dir);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return dir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool DirDef::matchPath(const QCString &path,QStrList &l)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
const char *s=l.first();
|
|
Packit |
1c1d7e |
while (s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString prefix = s;
|
|
Packit |
1c1d7e |
if (qstricmp(prefix.left(path.length()),path)==0) // case insensitive compare
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
s = l.next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! strip part of \a path if it matches
|
|
Packit |
1c1d7e |
* one of the paths in the Config_getList(STRIP_FROM_PATH) list
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
DirDef *DirDef::mergeDirectoryInTree(const QCString &path)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("DirDef::mergeDirectoryInTree(%s)\n",path.data());
|
|
Packit |
1c1d7e |
int p=0,i=0;
|
|
Packit |
1c1d7e |
DirDef *dir=0;
|
|
Packit |
1c1d7e |
while ((i=path.find('/',p))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString part=path.left(i+1);
|
|
Packit |
1c1d7e |
if (!matchPath(part,Config_getList(STRIP_FROM_PATH)) && (part!="/" && part!="//"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
dir=createNewDir(part);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
p=i+1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return dir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (target->parent()!=root)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writePartialDirPath(ol,root,target->parent());
|
|
Packit |
1c1d7e |
ol.writeString(" / ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),0,target->shortName());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writePartialFilePath(OutputList &ol,const DirDef *root,const FileDef *fd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (fd->getDirDef() && fd->getDirDef()!=root)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writePartialDirPath(ol,root,fd->getDirDef());
|
|
Packit |
1c1d7e |
ol.writeString(" / ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (fd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.startBold();
|
|
Packit |
1c1d7e |
ol.docify(fd->name());
|
|
Packit |
1c1d7e |
ol.endBold();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DirRelation::writeDocumentation(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString shortTitle=theTranslator->trDirRelation(
|
|
Packit |
1c1d7e |
m_src->shortName()+" → "+
|
|
Packit |
1c1d7e |
m_dst->dir()->shortName());
|
|
Packit |
1c1d7e |
QCString title=theTranslator->trDirRelation(
|
|
Packit |
1c1d7e |
m_src->displayName()+" -> "+
|
|
Packit |
1c1d7e |
m_dst->dir()->shortName());
|
|
Packit |
1c1d7e |
startFile(ol,getOutputFileBase(),getOutputFileBase(),
|
|
Packit |
1c1d7e |
title,HLI_None,!generateTreeView,m_src->getOutputFileBase());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!generateTreeView)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// write navigation path
|
|
Packit |
1c1d7e |
m_src->writeNavigationPath(ol);
|
|
Packit |
1c1d7e |
ol.endQuickIndices();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.startContents();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.writeString(""+shortTitle+"");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trFileIn(m_src->pathFragment()));
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.parseText(theTranslator->trIncludesFileIn(m_dst->dir()->pathFragment()));
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
SDict<FilePair>::Iterator fpi(m_dst->filePairs());
|
|
Packit |
1c1d7e |
FilePair *fp;
|
|
Packit |
1c1d7e |
for (fpi.toFirst();(fp=fpi.current());++fpi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
writePartialFilePath(ol,m_src,fp->source());
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
writePartialFilePath(ol,m_dst->dir(),fp->destination());
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.endContents();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
endFileWithNavPath(m_src,ol);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------
|
|
Packit |
1c1d7e |
// external functions
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** In order to create stable, but unique directory names,
|
|
Packit |
1c1d7e |
* we compute the common part of the path shared by all directories.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
static void computeCommonDirPrefix()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString path;
|
|
Packit |
1c1d7e |
DirDef *dir;
|
|
Packit |
1c1d7e |
DirSDict::Iterator sdi(*Doxygen::directories);
|
|
Packit |
1c1d7e |
if (Doxygen::directories->count()>0) // we have at least one dir
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// start will full path of first dir
|
|
Packit |
1c1d7e |
sdi.toFirst();
|
|
Packit |
1c1d7e |
dir=sdi.current();
|
|
Packit |
1c1d7e |
path=dir->name();
|
|
Packit |
1c1d7e |
int i=path.findRev('/',path.length()-2);
|
|
Packit |
1c1d7e |
path=path.left(i+1);
|
|
Packit |
1c1d7e |
bool done=FALSE;
|
|
Packit |
1c1d7e |
if (i==-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
path="";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while (!done)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int l = path.length();
|
|
Packit |
1c1d7e |
int count=0;
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString dirName = dir->name();
|
|
Packit |
1c1d7e |
if (dirName.length()>path.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (qstrncmp(dirName,path,l)!=0) // dirName does not start with path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int i=path.findRev('/',l-2);
|
|
Packit |
1c1d7e |
if (i==-1) // no unique prefix -> stop
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
path="";
|
|
Packit |
1c1d7e |
done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // restart with shorter path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
path=path.left(i+1);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // dir is shorter than path -> take path of dir as new start
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
path=dir->name();
|
|
Packit |
1c1d7e |
l=path.length();
|
|
Packit |
1c1d7e |
int i=path.findRev('/',l-2);
|
|
Packit |
1c1d7e |
if (i==-1) // no unique prefix -> stop
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
path="";
|
|
Packit |
1c1d7e |
done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // restart with shorter path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
path=path.left(i+1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
count++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (count==Doxygen::directories->count())
|
|
Packit |
1c1d7e |
// path matches for all directories -> found the common prefix
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString diskName = dir->name().right(dir->name().length()-path.length());
|
|
Packit |
1c1d7e |
dir->setDiskName(diskName);
|
|
Packit |
1c1d7e |
//printf("set disk name: %s -> %s\n",dir->name().data(),diskName.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void buildDirectories()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// for each input file
|
|
Packit |
1c1d7e |
FileNameListIterator fnli(*Doxygen::inputNameList);
|
|
Packit |
1c1d7e |
FileName *fn;
|
|
Packit |
1c1d7e |
for (fnli.toFirst();(fn=fnli.current());++fnli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileNameIterator fni(*fn);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (;(fd=fni.current());++fni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("buildDirectories %s\n",fd->name().data());
|
|
Packit |
1c1d7e |
if (fd->getReference().isEmpty() && !fd->isDocumentationFile())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *dir;
|
|
Packit |
1c1d7e |
if ((dir=Doxygen::directories->find(fd->getPath()))==0) // new directory
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
dir = DirDef::mergeDirectoryInTree(fd->getPath());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (dir) dir->addFile(fd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// do something for file imported via tag files.
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//DirDef *root = new DirDef("root:");
|
|
Packit |
1c1d7e |
// compute relations between directories => introduce container dirs.
|
|
Packit |
1c1d7e |
DirDef *dir;
|
|
Packit |
1c1d7e |
DirSDict::Iterator sdi(*Doxygen::directories);
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString name = dir->name();
|
|
Packit |
1c1d7e |
int i=name.findRev('/',name.length()-2);
|
|
Packit |
1c1d7e |
if (i>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *parent = Doxygen::directories->find(name.left(i+1));
|
|
Packit |
1c1d7e |
//if (parent==0) parent=root;
|
|
Packit |
1c1d7e |
if (parent)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
parent->addSubDir(dir);
|
|
Packit |
1c1d7e |
//printf("DirDef::addSubdir(): Adding subdir\n%s to\n%s\n",
|
|
Packit |
1c1d7e |
// dir->displayName().data(), parent->displayName().data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
dir->sort();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
Doxygen::directories->sort();
|
|
Packit |
1c1d7e |
computeCommonDirPrefix();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void computeDirDependencies()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *dir;
|
|
Packit |
1c1d7e |
DirSDict::Iterator sdi(*Doxygen::directories);
|
|
Packit |
1c1d7e |
// compute nesting level for each directory
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
dir->setLevel();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// compute uses dependencies between directories
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("computeDependencies for %s: #dirs=%d\n",dir->name().data(),Doxygen::directories.count());
|
|
Packit |
1c1d7e |
dir->computeDependencies();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void generateDirDocs(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *dir;
|
|
Packit |
1c1d7e |
DirSDict::Iterator sdi(*Doxygen::directories);
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
if (!dir->hasDocumentation())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
dir->writeDocumentation(ol);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (Config_getBool(DIRECTORY_GRAPH))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
SDict<DirRelation>::Iterator rdi(Doxygen::dirRelations);
|
|
Packit |
1c1d7e |
DirRelation *dr;
|
|
Packit |
1c1d7e |
for (rdi.toFirst();(dr=rdi.current());++rdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
dr->writeDocumentation(ol);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|