8398c9048d
code was modified slightly, so the code differs from the original downloadable 1.9.5 version
109 lines
No EOL
3.3 KiB
JavaScript
109 lines
No EOL
3.3 KiB
JavaScript
dojo.provide("dojox.charting.action2d.Tooltip");
|
|
|
|
dojo.require("dojox.charting.action2d.Base");
|
|
dojo.require("dijit.Tooltip");
|
|
|
|
dojo.require("dojox.lang.functional");
|
|
dojo.require("dojox.lang.functional.scan");
|
|
dojo.require("dojox.lang.functional.fold");
|
|
|
|
(function(){
|
|
var DEFAULT_TEXT = function(o){
|
|
var t = o.run && o.run.data && o.run.data[o.index];
|
|
if(t && typeof t == "object" && t.tooltip){
|
|
return t.tooltip;
|
|
}
|
|
return o.element == "bar" ? o.x : o.y;
|
|
};
|
|
|
|
var df = dojox.lang.functional, pi4 = Math.PI / 4, pi2 = Math.PI / 2;
|
|
|
|
dojo.declare("dojox.charting.action2d.Tooltip", dojox.charting.action2d.Base, {
|
|
// the data description block for the widget parser
|
|
defaultParams: {
|
|
text: DEFAULT_TEXT // the function to produce a tooltip from the object
|
|
},
|
|
optionalParams: {}, // no optional parameters
|
|
|
|
constructor: function(chart, plot, kwArgs){
|
|
// process optional named parameters
|
|
this.text = kwArgs && kwArgs.text ? kwArgs.text : DEFAULT_TEXT;
|
|
|
|
this.connect();
|
|
},
|
|
|
|
process: function(o){
|
|
if(o.type === "onplotreset" || o.type === "onmouseout"){
|
|
dijit.hideTooltip(this.aroundRect);
|
|
this.aroundRect = null;
|
|
return;
|
|
}
|
|
|
|
if(!o.shape || o.type !== "onmouseover"){ return; }
|
|
|
|
// calculate relative coordinates and the position
|
|
var aroundRect = {type: "rect"}, position = ["after", "before"];
|
|
switch(o.element){
|
|
case "marker":
|
|
aroundRect.x = o.cx;
|
|
aroundRect.y = o.cy;
|
|
aroundRect.width = aroundRect.height = 1;
|
|
break;
|
|
case "circle":
|
|
aroundRect.x = o.cx - o.cr;
|
|
aroundRect.y = o.cy - o.cr;
|
|
aroundRect.width = aroundRect.height = 2 * o.cr;
|
|
break;
|
|
case "column":
|
|
position = ["above", "below"];
|
|
case "bar":
|
|
aroundRect = dojo.clone(o.shape.getShape());
|
|
break;
|
|
default:
|
|
//case "slice":
|
|
if(!this.angles){
|
|
// calculate the running total of slice angles
|
|
if(typeof o.run.data[0] == "number"){
|
|
this.angles = df.map(df.scanl(o.run.data, "+", 0),
|
|
"* 2 * Math.PI / this", df.foldl(o.run.data, "+", 0));
|
|
}else{
|
|
this.angles = df.map(df.scanl(o.run.data, "a + b.y", 0),
|
|
"* 2 * Math.PI / this", df.foldl(o.run.data, "a + b.y", 0));
|
|
}
|
|
}
|
|
var angle = (this.angles[o.index] + this.angles[o.index + 1]) / 2;
|
|
aroundRect.x = o.cx + o.cr * Math.cos(angle);
|
|
aroundRect.y = o.cy + o.cr * Math.sin(angle);
|
|
aroundRect.width = aroundRect.height = 1;
|
|
// calculate the position
|
|
if(angle < pi4){
|
|
// do nothing: the position is right
|
|
}else if(angle < pi2 + pi4){
|
|
position = ["below", "above"];
|
|
}else if(angle < Math.PI + pi4){
|
|
position = ["before", "after"];
|
|
}else if(angle < 2 * Math.PI - pi4){
|
|
position = ["above", "below"];
|
|
}
|
|
/*
|
|
else{
|
|
// do nothing: the position is right
|
|
}
|
|
*/
|
|
break;
|
|
}
|
|
|
|
// adjust relative coordinates to absolute, and remove fractions
|
|
var lt = dojo.coords(this.chart.node, true);
|
|
aroundRect.x += lt.x;
|
|
aroundRect.y += lt.y;
|
|
aroundRect.x = Math.round(aroundRect.x);
|
|
aroundRect.y = Math.round(aroundRect.y);
|
|
aroundRect.width = Math.ceil(aroundRect.width);
|
|
aroundRect.height = Math.ceil(aroundRect.height);
|
|
this.aroundRect = aroundRect;
|
|
|
|
dijit.showTooltip(this.text(o), this.aroundRect, position);
|
|
}
|
|
});
|
|
})(); |