Blame src/tooltip.cpp

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