Commit dbd55926 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Added SOURCE_TOOLTIPS option for advanced tooltip support while source browsing

parent 4f520b36
......@@ -44,7 +44,6 @@ SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
SYMBOL_CACHE_SIZE = 0
LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
......
......@@ -2,6 +2,7 @@ JQUERY_VERSION = 1.7.1
JQUERY_UI_VERSION = 1.8.18
HASHCHANGE_VERSION = 1.3
SCROLL_VERSION = 1.4.2
POWERTIP_VERSION = 1.2.0
MINIFIER = /usr/local/bin/yuicompressor-2.4.7
SCRIPTS = jquery-$(JQUERY_VERSION).js \
jquery.ui-$(JQUERY_UI_VERSION).core.js \
......@@ -9,8 +10,10 @@ SCRIPTS = jquery-$(JQUERY_VERSION).js \
jquery.ui-$(JQUERY_UI_VERSION).mouse.js \
jquery.ui-$(JQUERY_UI_VERSION).resizable.js \
jquery.ba-$(HASHCHANGE_VERSION)-hashchange.js \
jquery.scrollTo-$(SCROLL_VERSION).js
RESULTS = jquery_p1.js jquery_p2.js jquery_p3.js jquery_ui.js jquery_fx.js
jquery.scrollTo-$(SCROLL_VERSION).js \
jquery.powertip-$(POWERTIP_VERSION).js
RESULTS = jquery_p1.js jquery_p2.js jquery_p3.js \
jquery_ui.js jquery_fx.js jquery_pt.js
SCRIPTS_MIN = $(SCRIPTS:%.js=%-min.js)
......@@ -26,6 +29,9 @@ jquery_ui.js: scripts
jquery.ui-$(JQUERY_UI_VERSION).resizable-min.js \
jquery.ba-$(HASHCHANGE_VERSION)-hashchange-min.js > jquery_ui.js
jquery_pt.js: scripts
cat jquery.powertip-$(POWERTIP_VERSION)-min.js > jquery_pt.js
jquery_fx.js: scripts
cat jquery.scrollTo-$(SCROLL_VERSION)-min.js > jquery_fx.js
......
......@@ -9,6 +9,7 @@ packages:
- jquery.ui.resizable
- jquery.hashchange: 1.3: http://benalman.com/projects/jquery-hashchange-plugin/
- jquery.scrollTo: 1.4.2: https://github.com/flesler/jquery.scrollTo
- jquery.powertip: 1.2.0: http://stevenbenner.github.io/jquery-powertip/
The Makefile will built the jquery_*.js files used by doxygen.
Some files are split into smaller parts to make sure Visual Studio can compile them
......
This diff is collapsed.
# Doxyfile 1.8.3.1
# Doxyfile 1.8.4
#---------------------------------------------------------------------------
# Project related configuration options
......@@ -124,6 +124,7 @@ STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
REFERENCES_LINK_SOURCE = YES
SOURCE_TOOLTIPS = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
CLANG_ASSISTED_PARSING = YES
......
......@@ -17,6 +17,7 @@
#include "growbuf.h"
#include "membername.h"
#include "filename.h"
#include "tooltip.h"
static Definition *g_currentDefinition=0;
static MemberDef *g_currentMemberDef=0;
......@@ -611,10 +612,19 @@ static void codifyLines(CodeOutputInterface &ol,FileDef *fd,const char *text,
static void writeMultiLineCodeLink(CodeOutputInterface &ol,
FileDef *fd,uint &line,uint &column,
const char *ref,const char *file,
const char *anchor,const char *text,
const char *tooltip)
Definition *d,
const char *text)
{
static bool sourceTooltips = Config_getBool("SOURCE_TOOLTIPS");
TooltipManager::instance()->addTooltip(d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
QCString tooltip;
if (!sourceTooltips) // fall back to simple "title" tooltips
{
tooltip = d->briefDescriptionAsTooltip();
}
bool done=FALSE;
char *p=(char *)text;
while (!done)
......@@ -685,14 +695,7 @@ void ClangParser::linkMacro(CodeOutputInterface &ol,FileDef *fd,
{
if (md->isDefine())
{
writeMultiLineCodeLink(ol,
fd,line,column,
md->getReference(),
md->getOutputFileBase(),
md->anchor(),
text,
md->briefDescriptionAsTooltip()
);
writeMultiLineCodeLink(ol,fd,line,column,md,text);
return;
}
}
......@@ -738,14 +741,7 @@ void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
{
addDocCrossReference(g_currentMemberDef,(MemberDef*)d);
}
writeMultiLineCodeLink(ol,
fd,line,column,
d->getReference(),
d->getOutputFileBase(),
d->anchor(),
text,
d->briefDescriptionAsTooltip()
);
writeMultiLineCodeLink(ol,fd,line,column,d,text);
}
else
{
......@@ -786,6 +782,7 @@ static void detectFunctionBody(const char *s)
void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
{
TooltipManager::instance()->clearTooltips();
// (re)set global parser state
g_currentDefinition=0;
g_currentMemberDef=0;
......@@ -894,6 +891,7 @@ void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
clang_disposeString(tokenString);
}
ol.endCodeLine();
TooltipManager::instance()->writeTooltips(ol);
}
ClangParser::ClangParser()
......
......@@ -3457,7 +3457,7 @@ QCString ClassDef::getSourceFileBase() const
}
else
{
return convertNameToFile(m_impl->fileName)+"_source";
return Definition::getSourceFileBase();
}
}
......
......@@ -40,6 +40,7 @@
#include "filedef.h"
#include "filename.h"
#include "namespacedef.h"
#include "tooltip.h"
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
......@@ -597,10 +598,19 @@ static void codifyLines(const char *text)
* split into multiple links with the same destination, one for each line.
*/
static void writeMultiLineCodeLink(CodeOutputInterface &ol,
const char *ref,const char *file,
const char *anchor,const char *text,
const char *tooltip)
Definition *d,
const char *text)
{
static bool sourceTooltips = Config_getBool("SOURCE_TOOLTIPS");
TooltipManager::instance()->addTooltip(d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
QCString tooltip;
if (!sourceTooltips) // fall back to simple "title" tooltips
{
tooltip = d->briefDescriptionAsTooltip();
}
bool done=FALSE;
char *p=(char *)text;
while (!done)
......@@ -881,11 +891,7 @@ static bool getLinkInScope(const QCString &c, // scope
}
//printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
writeMultiLineCodeLink(ol,md->getReference(),
md->getOutputFileBase(),
md->anchor(),
text ? text : memberText,
md->briefDescriptionAsTooltip());
writeMultiLineCodeLink(ol,md, text ? text : memberText);
addToSearchIndex(text ? text : memberText);
return TRUE;
}
......@@ -1004,7 +1010,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
g_anchorCount++;
}
}
writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),clName,cd->briefDescriptionAsTooltip());
writeMultiLineCodeLink(ol,cd,clName);
addToSearchIndex(className);
g_theCallContext.setClass(cd);
if (md)
......@@ -1063,7 +1069,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
{
text=clName;
}
writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),text,md->briefDescriptionAsTooltip());
writeMultiLineCodeLink(ol,md,text);
addToSearchIndex(clName);
if (g_currentMemberDef)
{
......@@ -1127,8 +1133,7 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const
}
// write the actual link
writeMultiLineCodeLink(ol,xmd->getReference(),
xmd->getOutputFileBase(),xmd->anchor(),memName,xmd->briefDescriptionAsTooltip());
writeMultiLineCodeLink(ol,xmd,memName);
addToSearchIndex(memName);
return TRUE;
}
......@@ -1498,12 +1503,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
{
if (ctx->method && ctx->method->isLinkable())
{
writeMultiLineCodeLink(*g_code,
ctx->method->getReference(),
ctx->method->getOutputFileBase(),
ctx->method->anchor(),
pName->data(),
ctx->method->briefDescriptionAsTooltip());
writeMultiLineCodeLink(*g_code,ctx->method,pName->data());
if (g_currentMemberDef)
{
addDocCrossReference(g_currentMemberDef,ctx->method);
......@@ -1582,12 +1582,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
}
else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
{
writeMultiLineCodeLink(*g_code,
ctx->objectVar->getReference(),
ctx->objectVar->getOutputFileBase(),
ctx->objectVar->anchor(),
pObject->data(),
ctx->objectVar->briefDescriptionAsTooltip());
writeMultiLineCodeLink(*g_code,ctx->objectVar,pObject->data());
if (g_currentMemberDef)
{
addDocCrossReference(g_currentMemberDef,ctx->objectVar);
......@@ -1599,12 +1594,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
) // object is class name
{
ClassDef *cd = ctx->objectType;
writeMultiLineCodeLink(*g_code,
cd->getReference(),
cd->getOutputFileBase(),
cd->anchor(),
pObject->data(),
cd->briefDescriptionAsTooltip());
writeMultiLineCodeLink(*g_code,cd,pObject->data());
}
else // object still needs to be resolved
{
......@@ -1613,12 +1603,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
if (cd && cd->isLinkable())
{
if (ctx->objectType==0) ctx->objectType=cd;
writeMultiLineCodeLink(*g_code,
cd->getReference(),
cd->getOutputFileBase(),
cd->anchor(),
pObject->data(),
cd->briefDescriptionAsTooltip());
writeMultiLineCodeLink(*g_code,cd,pObject->data());
}
else
{
......@@ -1978,7 +1963,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
//printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found);
if (found)
{
g_code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,yytext,fd->briefDescriptionAsTooltip());
writeMultiLineCodeLink(*g_code,fd,yytext);
}
else
{
......@@ -3559,6 +3544,7 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
//printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s searchCtx=%s\n",
// exBlock,exName,fd,className,searchCtx?searchCtx->name().data():"<none>");
if (s.isEmpty()) return;
TooltipManager::instance()->clearTooltips();
if (g_codeClassSDict==0)
{
resetCCodeParserState();
......@@ -3637,6 +3623,10 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
g_code->endCodeLine();
}
if (fd)
{
TooltipManager::instance()->writeTooltips(*g_code);
}
if (cleanupSourceDef)
{
// delete the temporary file definition used for this example
......
......@@ -786,6 +786,13 @@ and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
link to the source code. Otherwise they will link to the documentation.
' defval='1'/>
<option type='bool' id='SOURCE_TOOLTIPS' docs='
If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
source code will show a tooltip with additional information such as prototype,
brief description and links to the definition and documentation. Since this will
make the HTML file larger and loading of large files a bit slower, you can opt
to disable this feature.
' defval='1' depends='SOURCE_BROWSER'/>
<option type='bool' id='USE_HTAGS' docs='
If the USE_HTAGS tag is set to YES then the references to source code
will point to the HTML generated by the htags(1) tool instead of doxygen
......
This diff is collapsed.
......@@ -867,24 +867,53 @@ bool readCodeFragment(const char *fileName,
return found;
}
QCString Definition::getSourceFileBase() const
{
ASSERT(definitionType()!=Definition::TypeFile); // file overloads this method
QCString fn;
static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
if (sourceBrowser &&
m_impl->body && m_impl->body->startLine!=-1 && m_impl->body->fileDef)
{
fn = m_impl->body->fileDef->getSourceFileBase();
}
return fn;
}
QCString Definition::getSourceAnchor() const
{
QCString anchorStr;
if (m_impl->body && m_impl->body->startLine!=-1)
{
if (Htags::useHtags)
{
anchorStr.sprintf("L%d",m_impl->body->startLine);
}
else
{
anchorStr.sprintf("l%05d",m_impl->body->startLine);
}
}
return anchorStr;
}
/*! Write a reference to the source code defining this definition */
void Definition::writeSourceDef(OutputList &ol,const char *)
{
static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
ol.pushGeneratorState();
//printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
if (sourceBrowser &&
m_impl->body && m_impl->body->startLine!=-1 && m_impl->body->fileDef)
QCString fn = getSourceFileBase();
if (!fn.isEmpty())
{
QCString refText = theTranslator->trDefinedAtLineInSourceFile();
int lineMarkerPos = refText.find("@0");
int fileMarkerPos = refText.find("@1");
if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this.
{
QCString lineStr,anchorStr;
QCString lineStr;
lineStr.sprintf("%d",m_impl->body->startLine);
anchorStr.sprintf(Htags::useHtags ? "L%d" : "l%05d",m_impl->body->startLine);
QCString anchorStr = getSourceAnchor();
ol.startParagraph();
if (lineMarkerPos<fileMarkerPos) // line marker before file marker
{
......@@ -898,8 +927,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
ol.disable(OutputGenerator::Latex);
}
// write line link (HTML, LaTeX optionally)
ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
anchorStr,lineStr);
ol.writeObjectLink(0,fn,anchorStr,lineStr);
ol.enableAll();
ol.disable(OutputGenerator::Html);
if (latexSourceCode)
......@@ -922,8 +950,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
ol.disable(OutputGenerator::Latex);
}
// write line link (HTML, LaTeX optionally)
ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
0,m_impl->body->fileDef->name());
ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
ol.enableAll();
ol.disable(OutputGenerator::Html);
if (latexSourceCode)
......@@ -950,8 +977,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
ol.disable(OutputGenerator::Latex);
}
// write file link (HTML only)
ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
0,m_impl->body->fileDef->name());
ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
ol.enableAll();
ol.disable(OutputGenerator::Html);
if (latexSourceCode)
......@@ -975,8 +1001,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
}
ol.disableAllBut(OutputGenerator::Html);
// write line link (HTML only)
ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
anchorStr,lineStr);
ol.writeObjectLink(0,fn,anchorStr,lineStr);
ol.enableAll();
ol.disable(OutputGenerator::Html);
if (latexSourceCode)
......
......@@ -130,8 +130,11 @@ class Definition : public DefinitionIntf
/*! Returns the anchor within a page where this item can be found */
virtual QCString anchor() const = 0;
/*! Returns the name of the source listing of this file. */
virtual QCString getSourceFileBase() const { ASSERT(0); return "NULL"; }
/*! Returns the name of the source listing of this definition. */
virtual QCString getSourceFileBase() const;
/*! Returns the anchor of the source listing of this definition. */
virtual QCString getSourceAnchor() const;
/*! Returns the detailed description of this definition */
QCString documentation() const;
......
......@@ -208,6 +208,12 @@ class DocbookCodeGenerator : public CodeOutputInterface
writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
col+=strlen(name);
}
void writeTooltip(const char *, const DocLinkInfo &, const char *,
const char *, const SourceLinkInfo &, const SourceLinkInfo &
)
{
Docbook_DB(("(writeToolTip)\n"));
}
void startCodeLine(bool)
{
Docbook_DB(("(startCodeLine)\n"));
......@@ -235,16 +241,6 @@ class DocbookCodeGenerator : public CodeOutputInterface
m_external.resize(0);
m_insideCodeLine=FALSE;
}
void startCodeAnchor(const char *id)
{
Docbook_DB(("(startCodeAnchor)\n"));
m_t << "<anchor id=\"" << id << "\">";
}
void endCodeAnchor()
{
Docbook_DB(("(endCodeAnchor)\n"));
m_t << "</anchor>";
}
void startFontClass(const char * /*colorClass*/)
{
Docbook_DB(("(startFontClass)\n"));
......
......@@ -141,11 +141,11 @@ a.el {
a.elRef {
}
a.code, a.code:visited {
a.code, a.code:visited, a.line, a.line:visited {
color: #4665A2;
}
a.codeRef, a.codeRef:visited {
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
color: #4665A2;
}
......@@ -1165,6 +1165,177 @@ tr.heading h2 {
margin-bottom: 4px;
}
/* tooltip related style info */
.ttc {
position: absolute;
display: none;
}
#powerTip {
cursor: default;
white-space: nowrap;
background-color: white;
border: 1px solid gray;
border-radius: 4px 4px 4px 4px;
box-shadow: 1px 1px 7px gray;
display: none;
font-size: smaller;
max-width: 80%;
opacity: 0.9;
padding: 1ex 1em 1em;
position: absolute;
z-index: 2147483647;
}
#powerTip div.ttdoc {
color: grey;
font-style: italic;
}
#powerTip div.ttname a {
font-weight: bold;
}
#powerTip div.ttname {
font-weight: bold;
}
#powerTip div.ttdeci {
color: #006318;
}
#powerTip div {
margin: 0px;
padding: 0px;
font: 12px/16px Roboto,sans-serif;
}
#powerTip:before, #powerTip:after {
content: "";
position: absolute;
margin: 0px;
}
#powerTip.n:after, #powerTip.n:before,
#powerTip.s:after, #powerTip.s:before,
#powerTip.w:after, #powerTip.w:before,
#powerTip.e:after, #powerTip.e:before,
#powerTip.ne:after, #powerTip.ne:before,
#powerTip.se:after, #powerTip.se:before,
#powerTip.nw:after, #powerTip.nw:before,
#powerTip.sw:after, #powerTip.sw:before {
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
}
#powerTip.n:after, #powerTip.s:after,
#powerTip.w:after, #powerTip.e:after,
#powerTip.nw:after, #powerTip.ne:after,
#powerTip.sw:after, #powerTip.se:after {
border-color: rgba(255, 255, 255, 0);
}
#powerTip.n:before, #powerTip.s:before,
#powerTip.w:before, #powerTip.e:before,
#powerTip.nw:before, #powerTip.ne:before,
#powerTip.sw:before, #powerTip.se:before {
border-color: rgba(128, 128, 128, 0);
}
#powerTip.n:after, #powerTip.n:before,
#powerTip.ne:after, #powerTip.ne:before,
#powerTip.nw:after, #powerTip.nw:before {
top: 100%;
}
#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
border-top-color: #ffffff;
border-width: 10px;
margin: 0px -10px;
}
#powerTip.n:before {
border-top-color: #808080;
border-width: 11px;
margin: 0px -11px;
}
#powerTip.n:after, #powerTip.n:before {
left: 50%;
}
#powerTip.nw:after, #powerTip.nw:before {
right: 14px;
}
#powerTip.ne:after, #powerTip.ne:before {
left: 14px;
}
#powerTip.s:after, #powerTip.s:before,
#powerTip.se:after, #powerTip.se:before,
#powerTip.sw:after, #powerTip.sw:before {
bottom: 100%;
}
#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
border-bottom-color: #ffffff;
border-width: 10px;
margin: 0px -10px;
}
#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
border-bottom-color: #808080;
border-width: 11px;
margin: 0px -11px;
}
#powerTip.s:after, #powerTip.s:before {
left: 50%;
}
#powerTip.sw:after, #powerTip.sw:before {
right: 14px;
}
#powerTip.se:after, #powerTip.se:before {
left: 14px;
}
#powerTip.e:after, #powerTip.e:before {
left: 100%;
}
#powerTip.e:after {
border-left-color: #ffffff;
border-width: 10px;
top: 50%;
margin-top: -10px;
}
#powerTip.e:before {
border-left-color: #808080;
border-width: 11px;
top: 50%;
margin-top: -11px;
}
#powerTip.w:after, #powerTip.w:before {
right: 100%;
}
#powerTip.w:after {
border-right-color: #ffffff;
border-width: 10px;
top: 50%;
margin-top: -10px;
}
#powerTip.w:before {
border-right-color: #808080;
border-width: 11px;
top: 50%;
margin-top: -11px;
}
@media print
{
#top { display: none; }
......
......@@ -141,11 +141,11 @@
"a.elRef {\n"
"}\n"
"\n"
"a.code, a.code:visited {\n"
"a.code, a.code:visited, a.line, a.line:visited {\n"
" color: #4665A2; \n"
"}\n"
"\n"
"a.codeRef, a.codeRef:visited {\n"
"a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {\n"
" color: #4665A2; \n"
"}\n"
"\n"
......@@ -1165,6 +1165,177 @@
" margin-bottom: 4px;\n"
"}\n"
"\n"
"/* tooltip related style info */\n"
"\n"
".ttc {\n"
" position: absolute;\n"
" display: none;\n"
"}\n"
"\n"
"#powerTip {\n"
" cursor: default;\n"
" white-space: nowrap;\n"
" background-color: white;\n"
" border: 1px solid gray;\n"
" border-radius: 4px 4px 4px 4px;\n"
" box-shadow: 1px 1px 7px gray;\n"
" display: none;\n"
" font-size: smaller;\n"
" max-width: 80%;\n"
" opacity: 0.9;\n"
" padding: 1ex 1em 1em;\n"
" position: absolute;\n"
" z-index: 2147483647;\n"
"}\n"
"\n"
"#powerTip div.ttdoc {\n"
" color: grey;\n"
" font-style: italic;\n"
"}\n"
"\n"
"#powerTip div.ttname a {\n"
" font-weight: bold;\n"
"}\n"
"\n"
"#powerTip div.ttname {\n"
" font-weight: bold;\n"
"}\n"
"\n"
"#powerTip div.ttdeci {\n"
" color: #006318;\n"
"}\n"
"\n"
"#powerTip div {\n"
" margin: 0px;\n"
" padding: 0px;\n"
" font: 12px/16px Roboto,sans-serif;\n"
"}\n"
"\n"
"#powerTip:before, #powerTip:after {\n"
" content: \"\";\n"
" position: absolute;\n"
" margin: 0px;\n"
"}\n"
"\n"
"#powerTip.n:after, #powerTip.n:before,\n"
"#powerTip.s:after, #powerTip.s:before,\n"
"#powerTip.w:after, #powerTip.w:before,\n"
"#powerTip.e:after, #powerTip.e:before,\n"
"#powerTip.ne:after, #powerTip.ne:before,\n"
"#powerTip.se:after, #powerTip.se:before,\n"
"#powerTip.nw:after, #powerTip.nw:before,\n"
"#powerTip.sw:after, #powerTip.sw:before {\n"
" border: solid transparent;\n"
" content: \" \";\n"
" height: 0;\n"
" width: 0;\n"
" position: absolute;\n"
"}\n"
"\n"
"#powerTip.n:after, #powerTip.s:after,\n"
"#powerTip.w:after, #powerTip.e:after,\n"
"#powerTip.nw:after, #powerTip.ne:after,\n"
"#powerTip.sw:after, #powerTip.se:after {\n"
" border-color: rgba(255, 255, 255, 0);\n"
"}\n"
"\n"
"#powerTip.n:before, #powerTip.s:before,\n"
"#powerTip.w:before, #powerTip.e:before,\n"
"#powerTip.nw:before, #powerTip.ne:before,\n"
"#powerTip.sw:before, #powerTip.se:before {\n"
" border-color: rgba(128, 128, 128, 0);\n"
"}\n"