dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
162 lines (158 loc) • 5.68 kB
JavaScript
define(["dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang", "dojox/gfx",
"../Element", "./common", "../axis2d/common", "dojo/has"],
function(declare, arr, lang, gfx, Element, common, ac, has){
/*=====
dojox.charting.plot2d.__PlotCtorArgs = {
// summary:
// The base keyword arguments object for plot constructors.
// Note that the parameters for this may change based on the
// specific plot type (see the corresponding plot type for
// details).
// tooltipFunc: Function?
// An optional function used to compute tooltip text for this plot. It takes precedence over
// the default function when available.
// | function tooltipFunc(o) { return "text"; }
// `o`is the event object that triggered the tooltip.
tooltipFunc: null
};
=====*/
var Base = declare("dojox.charting.plot2d.Base", Element, {
// summary:
// Base class for all plot types.
constructor: function(chart, kwArgs){
// summary:
// Create a base plot for charting.
// chart: dojox/chart/Chart
// The chart this plot belongs to.
// kwArgs: dojox.charting.plot2d.__PlotCtorArgs?
// An optional arguments object to help define the plot.
// TODO does not work in markup
if(kwArgs && kwArgs.tooltipFunc){
this.tooltipFunc = kwArgs.tooltipFunc;
}
},
clear: function(){
// summary:
// Clear out all of the information tied to this plot.
// returns: dojox.charting.plot2d.Base
// A reference to this plot for functional chaining.
this.series = [];
this.dirty = true;
return this; // dojox/charting/plot2d/Base
},
setAxis: function(axis){
// summary:
// Set an axis for this plot.
// axis: dojox.charting.axis2d.Base
// The axis to set.
// returns: dojox/charting/plot2d/Base
// A reference to this plot for functional chaining.
return this; // dojox/charting/plot2d/Base
},
assignAxes: function(axes){
// summary:
// From an array of axes pick the ones that correspond to this plot and
// assign them to the plot using setAxis method.
// axes: Array
// An array of dojox/charting/axis2d/Base
// tags:
// protected
arr.forEach(this.axes, function(axis){
if(this[axis]){
this.setAxis(axes[this[axis]]);
}
}, this);
},
addSeries: function(run){
// summary:
// Add a data series to this plot.
// run: dojox.charting.Series
// The series to be added.
// returns: dojox/charting/plot2d/Base
// A reference to this plot for functional chaining.
this.series.push(run);
return this; // dojox/charting/plot2d/Base
},
getSeriesStats: function(){
// summary:
// Calculate the min/max on all attached series in both directions.
// returns: Object
// {hmin, hmax, vmin, vmax} min/max in both directions.
return common.collectSimpleStats(this.series, lang.hitch(this, "isNullValue"));
},
calculateAxes: function(dim){
// summary:
// Stub function for running the axis calculations (deprecated).
// dim: Object
// An object of the form { width, height }
// returns: dojox/charting/plot2d/Base
// A reference to this plot for functional chaining.
this.initializeScalers(dim, this.getSeriesStats());
return this; // dojox/charting/plot2d/Base
},
initializeScalers: function(){
// summary:
// Does nothing.
return this;
},
isDataDirty: function(){
// summary:
// Returns whether or not any of this plot's data series need to be rendered.
// returns: Boolean
// Flag indicating if any of this plot's series are invalid and need rendering.
return arr.some(this.series, function(item){ return item.dirty; }); // Boolean
},
render: function(dim, offsets){
// summary:
// Render the plot on the chart.
// dim: Object
// An object of the form { width, height }.
// offsets: Object
// An object of the form { l, r, t, b }.
// returns: dojox/charting/plot2d/Base
// A reference to this plot for functional chaining.
return this; // dojox/charting/plot2d/Base
},
renderLabel: function(group, x, y, label, theme, block, align){
var elem = ac.createText[this.opt.htmlLabels && gfx.renderer != "vml" ? "html" : "gfx"]
(this.chart, group, x, y, align?align:"middle", label, theme.series.font, theme.series.fontColor);
// if the label is inside we need to avoid catching events on it this would prevent action on
// chart elements
if(block){
// TODO this won't work in IE neither in VML nor in HTML
// a solution would be to catch the event on the label and refire it to the element
// possibly using elementFromPoint or having it already available
if(this.opt.htmlLabels && gfx.renderer != "vml"){
// we have HTML labels, let's use pointEvents on the HTML node
elem.style.pointerEvents = "none";
}else if(elem.rawNode){
// we have SVG labels, let's use pointerEvents on the SVG or VML node
elem.rawNode.style.pointerEvents = "none";
}
// else we have Canvas, we need do nothing, as Canvas text won't catch events
}
if(this.opt.htmlLabels && gfx.renderer != "vml"){
this.htmlElements.push(elem);
}
return elem;
},
getRequiredColors: function(){
// summary:
// Get how many data series we have, so we know how many colors to use.
// returns: Number
// The number of colors needed.
return this.series.length; // Number
},
_getLabel: function(number){
return common.getLabel(number, this.opt.fixed, this.opt.precision);
}
});
if(has("dojo-bidi")){
Base.extend({
_checkOrientation: function(group, dim, offsets){
this.chart.applyMirroring(this.group, dim, offsets);
}
});
}
return Base;
});