|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qdict.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "tooltip.h"
|
|
Packit |
1c1d7e |
#include "definition.h"
|
|
Packit |
1c1d7e |
#include "outputgen.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "filedef.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class TooltipManager::Private
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
Private() : tooltipInfo(10007) {}
|
|
Packit |
1c1d7e |
QDict<Definition> tooltipInfo;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
TooltipManager *TooltipManager::s_theInstance = 0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
TooltipManager::TooltipManager()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
p = new Private;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
TooltipManager::~TooltipManager()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete p;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
TooltipManager *TooltipManager::instance()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!s_theInstance)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
s_theInstance = new TooltipManager;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return s_theInstance;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void TooltipManager::clearTooltips()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
p->tooltipInfo.clear();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString escapeId(const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString res=s;
|
|
Packit |
1c1d7e |
char *p=res.rawData();
|
|
Packit |
1c1d7e |
while (*p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!isId(*p)) *p='_';
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return res;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void TooltipManager::addTooltip(Definition *d)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
|
|
Packit |
1c1d7e |
if (!sourceTooltips) return;
|
|
Packit |
1c1d7e |
QCString id = d->getOutputFileBase();
|
|
Packit |
1c1d7e |
int i=id.findRev('/');
|
|
Packit |
1c1d7e |
if (i!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
id = id.right(id.length()-i-1); // strip path (for CREATE_SUBDIRS=YES)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
id+=escapeId(Doxygen::htmlFileExtension);
|
|
Packit |
1c1d7e |
QCString anc = d->anchor();
|
|
Packit |
1c1d7e |
if (!anc.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
id+="_"+anc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (p->tooltipInfo.find(id)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
p->tooltipInfo.insert(id,d);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void TooltipManager::writeTooltips(CodeOutputInterface &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QDictIterator<Definition> di(p->tooltipInfo);
|
|
Packit |
1c1d7e |
Definition *d;
|
|
Packit |
1c1d7e |
for (di.toFirst();(d=di.current());++di)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocLinkInfo docInfo;
|
|
Packit |
1c1d7e |
docInfo.name = d->qualifiedName();
|
|
Packit |
1c1d7e |
docInfo.ref = d->getReference();
|
|
Packit |
1c1d7e |
docInfo.url = d->getOutputFileBase();
|
|
Packit |
1c1d7e |
docInfo.anchor = d->anchor();
|
|
Packit |
1c1d7e |
SourceLinkInfo defInfo;
|
|
Packit |
1c1d7e |
if (d->getBodyDef() && d->getStartBodyLine()!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
defInfo.file = d->getBodyDef()->name();
|
|
Packit |
1c1d7e |
defInfo.line = d->getStartBodyLine();
|
|
Packit |
1c1d7e |
defInfo.url = d->getSourceFileBase();
|
|
Packit |
1c1d7e |
defInfo.anchor = d->getSourceAnchor();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
SourceLinkInfo declInfo; // TODO: fill in...
|
|
Packit |
1c1d7e |
QCString decl;
|
|
Packit |
1c1d7e |
if (d->definitionType()==Definition::TypeMember)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberDef *md = (MemberDef*)d;
|
|
Packit |
1c1d7e |
decl = md->declaration();
|
|
Packit |
1c1d7e |
if (!decl.isEmpty() && decl.at(0)=='@') // hide enum values
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
decl.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.writeTooltip(di.currentKey(), // id
|
|
Packit |
1c1d7e |
docInfo, // symName
|
|
Packit |
1c1d7e |
decl, // decl
|
|
Packit |
1c1d7e |
d->briefDescriptionAsTooltip(), // desc
|
|
Packit |
1c1d7e |
defInfo,
|
|
Packit |
1c1d7e |
declInfo
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|