jui.define("chart.widget.cross", [ "util.base" ], function(_) {
/**
* @class chart.widget.cross
* @extends chart.widget.core
* @alias CoreWidget
* @requires util.base
*
*/
var CrossWidget = function(chart, axis, widget) {
var self = this;
var tw = 50, th = 18, ta = tw / 10; // 툴팁 넓이, 높이, 앵커 크기
var pl = 0, pt = 0; // 엑시스까지의 여백
var g, xline, yline, xTooltip, yTooltip;
var tspan = [];
function printTooltip(index, text, message) {
if(!tspan[index]) {
var elem = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
text.element.appendChild(elem);
tspan[index] = elem;
}
tspan[index].textContent = message;
}
this.drawBefore = function() {
// 위젯 옵션에 따라 엑시스 변경
axis = this.chart.axis(widget.axis);
// 엑시스 여백 값 가져오기
pl = chart.padding("left") + axis.area("x");
pt = chart.padding("top") + axis.area("y");
g = chart.svg.group({
visibility: "hidden"
}, function() {
// 포맷 옵션이 없을 경우, 툴팁을 생성하지 않음
if(_.typeCheck("function", widget.yFormat)) {
xline = chart.svg.line({
x1: 0,
y1: 0,
x2: axis.area("width"),
y2: 0,
stroke: chart.theme("crossBorderColor"),
"stroke-width": chart.theme("crossBorderWidth"),
opacity: chart.theme("crossBorderOpacity")
});
yTooltip = chart.svg.group({}, function () {
chart.svg.polygon({
fill: chart.theme("crossBalloonBackgroundColor"),
"fill-opacity": chart.theme("crossBalloonBackgroundOpacity"),
points: self.balloonPoints("left", tw, th, ta)
});
chart.text({
"font-size": chart.theme("crossBalloonFontSize"),
"fill": chart.theme("crossBalloonFontColor"),
"text-anchor": "middle",
x: tw / 2,
y: 12
});
}).translate(-(tw + ta), 0);
}
if(_.typeCheck("function", widget.xFormat)) {
yline = chart.svg.line({
x1: 0,
y1: 0,
x2: 0,
y2: axis.area("height"),
stroke: chart.theme("crossBorderColor"),
"stroke-width": chart.theme("crossBorderWidth"),
opacity: chart.theme("crossBorderOpacity")
});
xTooltip = chart.svg.group({}, function () {
chart.svg.polygon({
fill: chart.theme("crossBalloonBackgroundColor"),
"fill-opacity": chart.theme("crossBalloonBackgroundOpacity"),
points: self.balloonPoints("bottom", tw, th, ta)
});
chart.text({
"font-size": chart.theme("crossBalloonFontSize"),
"fill": chart.theme("crossBalloonFontColor"),
"text-anchor": "middle",
x: tw / 2,
y: 17
});
}).translate(0, axis.area("height") + ta);
}
}).translate(pl, pt);
}
this.draw = function() {
this.on("axis.mouseover", function(e) {
g.attr({ visibility: "visible" });
}, widget.axis);
this.on("axis.mouseout", function(e) {
g.attr({ visibility: "hidden" });
}, widget.axis);
this.on("axis.mousemove", function(e) {
g.attr({ visibility: "visible" });
var offset=3;
var left = e.bgX - pl + offset,
top = e.bgY - pt + offset;
if(xline) {
xline.attr({
y1: top,
y2: top
});
}
if(yline) {
yline.attr({
x1: left,
x2: left
});
}
// 포맷 옵션이 없을 경우, 처리하지 않음
if(yTooltip) {
yTooltip.translate(-(tw + ta), top - (th / 2));
var value = axis.y.invert(e.chartY+offset),
message = widget.yFormat.call(self.chart, value);
printTooltip(0, yTooltip.get(1), message);
}
if(xTooltip) {
xTooltip.translate(left - (tw / 2), axis.area("height") + ta);
var value = axis.x.invert(e.chartX+offset),
message = widget.xFormat.call(self.chart, value);
printTooltip(1, xTooltip.get(1), message);
}
}, widget.axis);
return g;
}
}
CrossWidget.setup = function() {
return {
axis: 0,
/**
* @cfg {Function} [xFormat=null] Sets the format for the value on the X axis shown on the tooltip.
*/
xFormat: null,
/**
* @cfg {Function} [yFormat=null] Sets the format for the value on the Y axis shown on the tooltip.
*/
yFormat: null
};
}
return CrossWidget;
}, "chart.widget.core");