You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ed...@apache.org on 2006/11/11 17:44:48 UTC
svn commit: r473755 [6/43] - in /jackrabbit/trunk/contrib/jcr-browser: ./
src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/jackrabbit/
src/main/java/org/apache/jackrabbit/browser/ src/main/resources/ s...
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plot.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plot.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plot.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plot.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,93 @@
+dojo.provide("dojo.charting.Plot");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.charting.Axis");
+dojo.require("dojo.charting.Series");
+
+dojo.charting.RenderPlotSeries = { Singly:"single", Grouped:"grouped" };
+
+dojo.charting.Plot = function(
+ /* dojo.charting.Axis? */xaxis,
+ /* dojo.charting.Axis? */yaxis,
+ /* dojo.charting.Series[]? */series
+){
+ // summary
+ // Creates a new instance of a Plot (X/Y Axis + n Series).
+ var id = "dojo-charting-plot-"+dojo.charting.Plot.count++;
+ this.getId=function(){ return id; };
+ this.setId=function(key){ id = key; };
+ this.axisX = null;
+ this.axisY = null;
+ this.series = [];
+ this.dataNode = null;
+
+ // for bar charts, pie charts and stacked charts, change to Grouped.
+ this.renderType = dojo.charting.RenderPlotSeries.Singly;
+ if(xaxis){
+ this.setAxis(xaxis,"x");
+ }
+ if(yaxis){
+ this.setAxis(yaxis,"y");
+ }
+ if(series){
+ for(var i=0; i<series.length; i++){ this.addSeries(series[i]); }
+ }
+}
+dojo.charting.Plot.count=0;
+
+dojo.extend(dojo.charting.Plot, {
+ addSeries: function(
+ /* dojo.charting.Series || object */series,
+ /* function? */plotter
+ ){
+ // summary
+ // Add a new Series to this plot. Can take the form of a Series, or an object
+ // of the form { series, plotter }
+ if(series.plotter){
+ this.series.push(series);
+ } else {
+ this.series.push({
+ data: series,
+ plotter: plotter || dojo.charting.Plotters["Default"]
+ });
+ }
+ },
+ setAxis: function(/* dojo.charting.Axis */axis, /* string */which){
+ // summary
+ // Set the axis on which plane.
+ if(which.toLowerCase()=="x"){ this.axisX = axis; }
+ else if(which.toLowerCase()=="y"){ this.axisY = axis; }
+ },
+ getRanges: function(){
+ // summary
+ // set the ranges on these axes.
+ var xmin, xmax, ymin, ymax;
+ xmin=ymin=Number.MAX_VALUE;
+ xmax=ymax=Number.MIN_VALUE;
+ for(var i=0; i<this.series.length; i++){
+ var values = this.series[i].data.evaluate(); // full data range.
+ for(var j=0; j<values.length; j++){
+ var comp=values[j];
+ xmin=Math.min(comp.x, xmin);
+ ymin=Math.min(comp.y, ymin);
+ xmax=Math.max(comp.x, xmax);
+ ymax=Math.max(comp.y, ymax);
+ }
+ }
+ return {
+ x:{ upper: xmax, lower:xmin },
+ y:{ upper: ymax, lower:ymin },
+ toString:function(){
+ return "[ x:"+xmax+" - "+xmin+", y:"+ymax+" - "+ymin+"]";
+ }
+ }; // object
+ },
+ destroy: function(){
+ // summary
+ // Clean out any existing DOM node references.
+ var node=this.dataNode;
+ while(node && node.childNodes && node.childNodes.length > 0){
+ node.removeChild(node.childNodes[0]);
+ }
+ this.dataNode=null;
+ }
+});
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plot.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/PlotArea.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/PlotArea.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/PlotArea.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/PlotArea.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,183 @@
+dojo.provide("dojo.charting.PlotArea");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.gfx.color");
+dojo.require("dojo.gfx.color.hsl");
+dojo.require("dojo.charting.Plot");
+
+dojo.charting.PlotArea = function(){
+ // summary
+ // Creates a new PlotArea for drawing onto a Chart.
+ var id="dojo-charting-plotarea-"+dojo.charting.PlotArea.count++;
+ this.getId=function(){ return id; };
+ this.setId=function(key){ id = key; };
+ this.areaType = "standard"; // standard || radar
+ this.plots = []; // plots that will be drawn on this area
+
+ this.size={ width:600, height:400 };
+ this.padding={ top:10, right:10, bottom:20, left:20 };
+
+ // drawing node references.
+ this.nodes = {
+ main:null,
+ area:null,
+ background: null,
+ axes: null,
+ plots: null
+ };
+
+ // this is preset for a limited color range (green to purple),
+ // anticipating a max of 32 series on this plot area.
+ // if you need more flexibility, override these numbers.
+ this._color = { h: 140, s: 120, l: 120, step: 27 };
+};
+dojo.charting.PlotArea.count = 0;
+
+dojo.extend(dojo.charting.PlotArea, {
+ nextColor: function(){
+ // summary
+ // Advances the internal HSV cursor and returns the next generated color.
+ var rgb=dojo.gfx.color.hsl2rgb(this._color.h, this._color.s, this._color.l);
+ this._color.h = (this._color.h + this._color.step)%360;
+ while(this._color.h < 140){
+ this._color.h += this._color.step;
+ }
+ return dojo.gfx.color.rgb2hex(rgb[0], rgb[1], rgb[2]); // string
+ },
+ getArea:function(){
+ // summary
+ // Return an object describing the coordinates of the available area to plot on.
+ return {
+ left: this.padding.left,
+ right: this.size.width - this.padding.right,
+ top: this.padding.top,
+ bottom: this.size.height - this.padding.bottom,
+ toString:function(){
+ var a=[ this.top, this.right, this.bottom, this.left ];
+ return "["+a.join()+"]";
+ }
+ }; // object
+ },
+ getAxes: function(){
+ // summary
+ // get the unique axes for this plot area.
+ var axes={};
+ for(var i=0; i<this.plots.length; i++){
+ var plot=this.plots[i];
+ axes[plot.axisX.getId()] = {
+ axis: plot.axisX,
+ drawAgainst: plot.axisY,
+ plot: plot,
+ plane: "x"
+ };
+ axes[plot.axisY.getId()] = {
+ axis: plot.axisY,
+ drawAgainst: plot.axisX,
+ plot: plot,
+ plane: "y"
+ };
+ }
+ return axes; // object
+ },
+ getLegendInfo: function(){
+ // summary
+ // return an array describing all data series on this plot area.
+ var a=[];
+ for(var i=0; i<this.plots.length; i++){
+ for(var j=0; j<this.plots[i].series.length; j++){
+ var data = this.plots[i].series[j].data;
+ a.push({ label:data.label, color:data.color });
+ }
+ }
+ return a; // array
+ },
+ setAxesRanges: function(){
+ // summary
+ // Find and set the ranges on all axes on this plotArea.
+ // We do this because plots may have axes in common; if you
+ // want to use this, make sure you do it *before* initialization.
+ var ranges={};
+ var axes={};
+ for(var i=0; i<this.plots.length; i++){
+ var plot = this.plots[i];
+ var ranges=plot.getRanges();
+ var x=ranges.x;
+ var y=ranges.y;
+ var ax, ay;
+ if(!axes[plot.axisX.getId()]){
+ axes[plot.axisX.getId()]=plot.axisX;
+ ranges[plot.axisX.getId()]={upper: x.upper, lower:x.lower};
+ }
+ ax=ranges[plot.axisX.getId()];
+ ax.upper=Math.max(ax.upper, x.upper);
+ ax.lower=Math.min(ax.lower, x.lower);
+
+ if(!axes[plot.axisY.getId()]){
+ axes[plot.axisY.getId()]=plot.axisY;
+ ranges[plot.axisY.getId()]={upper: y.upper, lower:y.lower};
+ }
+ ay=ranges[plot.axisY.getId()];
+ ay.upper=Math.max(ay.upper, y.upper);
+ ay.lower=Math.min(ay.lower, y.lower);
+ }
+
+ // now that we have all the max/min ranges, set the axes
+ for(var p in axes){
+ axes[p].range=ranges[p];
+ }
+ },
+
+ render: function(/* object? */kwArgs, /* function? */applyToData){
+ // summary
+ // Render this plotArea. Optional kwArgs are the same as that taken for Series.evaluate;
+ // applyToData is a callback function used by plotters for customization.
+ if(!this.nodes.main
+ || !this.nodes.area
+ || !this.nodes.background
+ || !this.nodes.plots
+ || !this.nodes.axes
+ ){ this.initialize(); }
+
+ // plot it.
+ for(var i=0; i<this.plots.length; i++){
+ var plot=this.plots[i];
+ this.nodes.plots.removeChild(plot.dataNode);
+ var target = this.initializePlot(plot);
+ switch(plot.renderType){
+ case dojo.charting.RenderPlotSeries.Grouped: {
+ // ALWAYS plot using the first plotter, ignore any others.
+ target.appendChild(plot.series[0].plotter(this, plot, kwArgs, applyToData));
+ break;
+ }
+ case dojo.charting.RenderPlotSeries.Singly:
+ default: {
+ for(var j=0; j<plot.series.length; j++){
+ var series = plot.series[j];
+ var data = series.data.evaluate(kwArgs);
+ target.appendChild(series.plotter(data, this, plot, applyToData));
+ }
+ }
+ }
+ this.nodes.plots.appendChild(target);
+ }
+ },
+ destroy: function(){
+ // summary
+ // Clean out any existing DOM references.
+ for(var i=0; i<this.plots.length; i++){
+ this.plots[i].destroy();
+ };
+ // clean out any child nodes.
+ for(var p in this.nodes){
+ var node=this.nodes[p];
+ if(!node) continue;
+ if(!node.childNodes) continue;
+ while(node.childNodes.length > 0){
+ node.removeChild(node.childNodes[0]);
+ }
+ this.nodes[p]=null;
+ }
+ }
+});
+
+dojo["requireIf"](dojo.render.svg.capable, "dojo.charting.svg.PlotArea");
+dojo["requireIf"](!dojo.render.svg.capable && dojo.render.vml.capable, "dojo.charting.vml.PlotArea");
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/PlotArea.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plotters.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plotters.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plotters.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plotters.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,9 @@
+dojo.provide("dojo.charting.Plotters");
+
+/*
+ * Plotters is the placeholder; what will happen is that the proper renderer types
+ * will be mixed into this object (as opposed to creating a new one).
+ */
+
+dojo["requireIf"](dojo.render.svg.capable, "dojo.charting.svg.Plotters");
+dojo["requireIf"](!dojo.render.svg.capable && dojo.render.vml.capable, "dojo.charting.vml.Plotters");
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Plotters.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/README.txt
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/README.txt?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/README.txt (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/README.txt Sat Nov 11 08:44:22 2006
@@ -0,0 +1,46 @@
+Dojo Charting Engine
+=========================================================================
+The Dojo Charting Engine is a (fairly) complex object structure, designed
+to provide as much flexibility as possible in terms of chart construction.
+To this end, the engine details the following structure:
+
+Chart
+---PlotArea[]
+------Plot[]
+---------Axis (axisX)
+---------Axis (axisY)
+---------Series[]
+
+
+A Chart object is the main entity; it is the entire graphic. A Chart may
+have any number of PlotArea objects, which are the basic canvas against
+which data is plotted. A PlotArea may have any number of Plot objects,
+which is a container representing up to 2 axes and any number of series
+to be plotted against those axes; a Series represents a binding against
+two fields from a data source (initial rev, this data source is always of
+type dojo.collections.Store but this will probably change once dojo.data
+is in production).
+
+The point of this structure is to allow for as much flexibility as possible
+in terms of what kinds of charts can be represented by the engine. The
+current plan is to accomodate up to analytical financial charts, which tend
+to have 3 plot areas and any number of different types of axes on each one.
+
+The main exception to this is the pie chart, which will have it's own
+custom codebase. Also, 3D charts are not accounted for at this time,
+although the only thing that will probably need to be altered to make
+that work would be Plot and Series (to accomodate the additional Z axis).
+
+Finally, a Plot will render its series[] through the use of Plotters, which
+are custom methods to render specific types of charts.
+-------------------------------------------------------------------------
+In terms of widgets, the basic concept is that there is a central, super-
+flexible Chart widget (Chart, oddly enough), and then any number of preset
+chart type widgets, that are basically built to serve a simple, easy
+purpose. For instance, if someone just needs to plot a series of lines,
+they would be better off using the LineChart widget; but if someone needed
+to plot a combo chart, that has 2 Y Axes (one linear, one log) against the
+same X Axis, using lines and areas, then they will want to use a Chart widget.
+Note also that unlike other widgets, the Charting engine *can* be called
+directly from script *without* the need for the actual widget engine to be
+loaded; the Chart widgets are thin wrappers around the charting engine.
\ No newline at end of file
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/README.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Series.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Series.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Series.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Series.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,205 @@
+dojo.provide("dojo.charting.Series");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.charting.Plotters");
+
+dojo.charting.Series = function(/* object? */kwArgs){
+ // summary
+ // Create an instance of data series for plotting.
+ var args = kwArgs || { length:1 };
+ this.dataSource = args.dataSource || null;
+ this.bindings = { };
+ this.color = args.color;
+ this.label = args.label;
+
+ if(args.bindings){
+ for(var p in args.bindings){
+ this.addBinding(p, args.bindings[p]);
+ }
+ }
+};
+
+dojo.extend(dojo.charting.Series, {
+ bind:function(/* dojo.collections.Store */src, /* object */bindings){
+ // summary
+ // Bind this series to src, with bindings.
+ this.dataSource = src;
+ this.bindings = bindings;
+ },
+ addBinding:function(/* string */name, /* string */binding){
+ // summary
+ // Bind to field "binding" using "name".
+ this.bindings[name] = binding;
+ },
+ evaluate:function(/* object? */kwArgs){
+ // summary
+ // Evaluate all bindings and return an array of objects describing the bind.
+ var ret = [];
+ var a = this.dataSource.getData();
+ var l = a.length;
+ var start = 0;
+ var end = l;
+
+ /* Allow for ranges. Can be done in one of two ways:
+ * 1. { from, to } as 0-based indices
+ * 2. { length } as num of data points to get; a negative
+ * value will start from the end of the data set.
+ * No kwArg object means the full data set will be evaluated
+ * and returned.
+ */
+ if(kwArgs){
+ if(kwArgs.from){
+ start = Math.max(kwArgs.from,0);
+ if(kwArgs.to){
+ end = Math.min(kwArgs.to, end);
+ }
+ }
+ else if(kwArgs.length){
+ if(kwArgs.length < 0){
+ // length points from end
+ start = Math.max((end + length),0);
+ } else {
+ end = Math.min((start + length), end);
+ }
+ }
+ }
+
+ for(var i=start; i<end; i++){
+ var o = { src: a[i], series: this };
+ for(var p in this.bindings){
+ o[p] = this.dataSource.getField(a[i], this.bindings[p]);
+ }
+ ret.push(o);
+ }
+
+ // sort by the x axis, if available.
+ if(typeof(ret[0].x) != "undefined"){
+ ret.sort(function(a,b){
+ if(a.x > b.x) return 1;
+ if(a.x < b.x) return -1;
+ return 0;
+ });
+ }
+ return ret; // array
+ },
+
+ // trends
+ trends:{
+ createRange: function(/* array */values, /* int */len){
+ // summary
+ // Creates the data range used for all trends.
+ var idx = values.length-1;
+ var length = (len||values.length);
+ return { "index": idx, "length": length, "start":Math.max(idx-length,0) }; // object
+ },
+
+ mean: function(/* array */values, /* int */len){
+ // summary
+ // Returns the mean or average over the set of values.
+ var range = this.createRange(values, len);
+ if(range.index<0){ return 0; }
+ var total = 0;
+ var count = 0;
+ for(var i=range.index; i>=range.start; i--){
+ total += values[i].y;
+ count++;
+ }
+ total /= Math.max(count,1);
+ return total; // float
+ },
+
+ variance: function(/* array */values,/* int */len){
+ // summary
+ // Returns the variance of the set of values.
+ var range = this.createRange(values,len);
+ if(range.index < 0){ return 0; }
+ var total = 0;
+ var square = 0;
+ var count = 0;
+ for(var i=range.index; i>=range.start; i--){
+ total += values[i].y;
+ square += Math.pow(values[i].y, 2);
+ count++;
+ }
+ return (square/count)-Math.pow(total/count,2); // float
+ },
+
+ standardDeviation: function(/* array */values, /* int */len){
+ // summary
+ // Returns the standard deviation of the set of values.
+ return Math.sqrt(this.getVariance(values, len)); // float
+ },
+
+ max: function(/* array */values, /* int */len){
+ // summary
+ // Returns the max number in the set of values.
+ var range = this.createRange(values, len);
+ if(range.index < 0){ return 0; }
+ var max = Number.MIN_VALUE;
+ for (var i=range.index; i>=range.start; i--){
+ max = Math.max(values[i].y,max);
+ }
+ return max; // float
+ },
+
+ min: function(/* array */values, /* int */len){
+ // summary
+ // Returns the lowest number in the set of values.
+ var range=this.createRange(values, len);
+ if(range.index < 0){ return 0; }
+ var min = Number.MAX_VALUE;
+ for(var i=range.index; i>=range.start; i--){
+ min = Math.min(values[i].y, min);
+ }
+ return min; // float
+ },
+
+ median: function(/* array */values, /* int */len){
+ // summary
+ // Returns the median in the set of values (number closest to the middle of a sorted set).
+ var range = this.createRange(values, len);
+ if(range.index<0){ return 0; }
+ var a = [];
+ for (var i=range.index; i>=range.start; i--){
+ var b=false;
+ for(var j=0; j<a.length; j++){
+ if(values[i].y == a[j]){
+ b = true;
+ break;
+ }
+ }
+ if(!b){
+ a.push(values[i].y);
+ }
+ }
+ a.sort();
+ if(a.length > 0){
+ return a[Math.ceil(a.length / 2)]; // float
+ }
+ return 0; // float
+ },
+
+ mode: function(/* array */values, /* int */len){
+ // summary
+ // Returns the mode in the set of values
+ var range=this.createRange(values, len);
+ if(range.index<0){ return 0; }
+ var o = {};
+ var ret = 0
+ var median = Number.MIN_VALUE;
+ for(var i=range.index; i>=range.start; i--){
+ if (!o[values[i].y]){
+ o[values[i].y] = 1;
+ } else {
+ o[values[i].y]++;
+ }
+ }
+ for(var p in o){
+ if(median < o[p]){
+ median = o[p];
+ ret=p;
+ }
+ }
+ return ret;
+ }
+ }
+});
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/Series.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/__package__.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/__package__.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/__package__.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/__package__.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1 @@
+dojo.provide("dojo.charting.*");
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/__package__.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Axis.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Axis.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Axis.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Axis.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,214 @@
+dojo.provide("dojo.charting.svg.Axis");
+dojo.require("dojo.lang.common");
+
+dojo.extend(dojo.charting.Axis, {
+ renderLines: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* string */plane
+ ){
+ // summary
+ // Renders any reference lines for this axis.
+ if(this.nodes.lines){
+ while(this.nodes.lines.childNodes.length > 0){
+ this.nodes.lines.removeChild(this.nodes.lines.childNodes[0]);
+ }
+ if(this.nodes.lines.parentNode){
+ this.nodes.lines.parentNode.removeChild(this.nodes.lines);
+ this.nodes.lines = null;
+ }
+ }
+
+ var area = plotArea.getArea();
+ var g = this.nodes.lines = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ g.setAttribute("id", this.getId()+"-lines");
+ for(var i=0; i<this._labels.length; i++){
+ if (this._labels[i].value == this.origin){ continue; }
+
+ var v = this.getCoord(this._labels[i].value, plotArea, plot);
+ var l=document.createElementNS(dojo.svg.xmlns.svg, "line");
+ l.setAttribute("style","stroke:#999;stroke-width:1px;stroke-dasharray:1,4;");
+ if(plane == "x"){
+ l.setAttribute("y1",area.top);
+ l.setAttribute("y2",area.bottom);
+ l.setAttribute("x1",v);
+ l.setAttribute("x2",v);
+ }
+ else if (plane == "y"){
+ l.setAttribute("y1",v);
+ l.setAttribute("y2",v);
+ l.setAttribute("x1",area.left);
+ l.setAttribute("x2",area.right);
+ }
+ g.appendChild(l);
+ }
+ return g; // SVGGElement
+ },
+ renderTicks: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* string */plane,
+ /* float */coord
+ ){
+ // summary
+ // Renders any tick lines for this axis.
+ if(this.nodes.ticks){
+ while(this.nodes.ticks.childNodes.length > 0){
+ this.nodes.ticks.removeChild(this.nodes.ticks.childNodes[0]);
+ }
+ if(this.nodes.ticks.parentNode){
+ this.nodes.ticks.parentNode.removeChild(this.nodes.ticks);
+ this.nodes.ticks = null;
+ }
+ }
+
+ var g = this.nodes.ticks = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ g.setAttribute("id", this.getId()+"-ticks");
+ for(var i=0; i<this._labels.length; i++){
+ var v = this.getCoord(this._labels[i].value, plotArea, plot);
+
+ var l=document.createElementNS(dojo.svg.xmlns.svg, "line");
+ l.setAttribute("style","stroke:#000;stroke-width:1pt;");
+ if(plane == "x"){
+ l.setAttribute("y1",coord);
+ l.setAttribute("y2",coord+3);
+ l.setAttribute("x1",v);
+ l.setAttribute("x2",v);
+ }
+ else if (plane == "y"){
+ l.setAttribute("y1",v);
+ l.setAttribute("y2",v);
+ l.setAttribute("x1",coord-2);
+ l.setAttribute("x2",coord+2);
+ }
+ g.appendChild(l);
+ }
+ return g; // SVGGElement
+ },
+ renderLabels: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* string */plane,
+ /* float */coord,
+ /* int */textSize,
+ /* string */anchor
+ ){
+ // summary
+ // Render all labels for this axis.
+ function createLabel(label, x, y, textSize, anchor){
+ var text = document.createElementNS(dojo.svg.xmlns.svg, "text");
+ text.setAttribute("x", x);
+ text.setAttribute("y", (plane=="x"?y:y+2));
+ text.setAttribute("style", "text-anchor:"+anchor+";font-family:sans-serif;font-size:"+textSize+"px;fill:#000;");
+ text.appendChild(document.createTextNode(label));
+ return text;
+ };
+
+ // wipe if needed
+ if(this.nodes.labels){
+ while(this.nodes.labels.childNodes.length > 0){
+ this.nodes.labels.removeChild(this.nodes.labels.childNodes[0]);
+ }
+ if(this.nodes.labels.parentNode){
+ this.nodes.labels.parentNode.removeChild(this.nodes.labels);
+ this.nodes.labels = null;
+ }
+ }
+ var g = this.nodes.labels = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ g.setAttribute("id", this.getId()+"-labels");
+
+ for(var i=0; i<this._labels.length; i++){
+ var v = this.getCoord(this._labels[i].value, plotArea, plot);
+ if(plane == "x"){
+ g.appendChild(createLabel(this._labels[i].label, v, coord, textSize, anchor));
+ }
+ else if (plane == "y"){
+ g.appendChild(createLabel(this._labels[i].label, coord, v, textSize, anchor));
+ }
+ }
+ return g; // SVGGelement
+ },
+ render: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* dojo.charting.Axis */drawAgainst,
+ /* string */plane
+ ){
+ // summary
+ // Renders this axis to the given plot.
+
+ // get the origin plot point.
+ var area = plotArea.getArea();
+ var stroke = 1;
+ var style = "stroke:#000;stroke-width:"+stroke+"px;";
+ var textSize=10;
+ var coord = drawAgainst.getCoord(this.origin, plotArea, plot);
+
+ // draw the axis.
+ this.nodes.main = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ var g = this.nodes.main;
+ g.setAttribute("id", this.getId()); // need a handle if we have to kill parts of the axis def.
+ var line = this.nodes.axis = document.createElementNS(dojo.svg.xmlns.svg, "line");
+ if(plane == "x"){
+ line.setAttribute("y1", coord);
+ line.setAttribute("y2", coord);
+ line.setAttribute("x1", area.left-stroke);
+ line.setAttribute("x2", area.right+stroke);
+ line.setAttribute("style", style);
+
+ // set up the labels
+ var y = coord+textSize+2;
+ if(this.showLines){
+ g.appendChild(this.renderLines(plotArea, plot, plane, y));
+ }
+ if(this.showTicks){
+ g.appendChild(this.renderTicks(plotArea, plot, plane, coord));
+ }
+ if(this.showLabels){
+ g.appendChild(this.renderLabels(plotArea, plot, plane, y, textSize, "middle"));
+ }
+ if(this.showLabel && this.label){
+ var x = plotArea.size.width/2;
+ var text = document.createElementNS(dojo.svg.xmlns.svg, "text");
+ text.setAttribute("x", x);
+ text.setAttribute("y", (coord + (textSize*2) + (textSize/2)));
+ text.setAttribute("style", "text-anchor:middle;font-family:sans-serif;font-weight:bold;font-size:"+(textSize+2)+"px;fill:#000;");
+ text.appendChild(document.createTextNode(this.label));
+ g.appendChild(text);
+ }
+ } else {
+ line.setAttribute("x1", coord);
+ line.setAttribute("x2", coord);
+ line.setAttribute("y1", area.top);
+ line.setAttribute("y2", area.bottom);
+ line.setAttribute("style", style);
+
+ // set up the labels
+ var isMax = this.origin == drawAgainst.range.upper;
+ var x = coord + (isMax?4:-4);
+ var anchor = isMax?"start":"end";
+ if(this.showLines){
+ g.appendChild(this.renderLines(plotArea, plot, plane, x));
+ }
+ if(this.showTicks){
+ g.appendChild(this.renderTicks(plotArea, plot, plane, coord));
+ }
+ if(this.showLabels){
+ g.appendChild(this.renderLabels(plotArea, plot, plane, x, textSize, anchor));
+ }
+ if(this.showLabel && this.label){
+ var x = isMax?(coord+(textSize*2)+(textSize/2)):(coord-(textSize*4));
+ var y = plotArea.size.height / 2;
+ var text = document.createElementNS(dojo.svg.xmlns.svg, "text");
+ text.setAttribute("x", x);
+ text.setAttribute("y", y);
+ text.setAttribute("transform", "rotate(90, " + x + ", " + y + ")");
+ text.setAttribute("style", "text-anchor:middle;font-family:sans-serif;font-weight:bold;font-size:"+(textSize+2)+"px;fill:#000;");
+ text.appendChild(document.createTextNode(this.label));
+ g.appendChild(text);
+ }
+ }
+ g.appendChild(line);
+ return g; // SVGGElement
+ }
+});
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Axis.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/PlotArea.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/PlotArea.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/PlotArea.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/PlotArea.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,69 @@
+dojo.provide("dojo.charting.svg.PlotArea");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.svg");
+
+dojo.extend(dojo.charting.PlotArea, {
+ initializePlot: function(plot){
+ // summary
+ // Initialize the plot node for data rendering.
+ plot.destroy();
+ plot.dataNode = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ plot.dataNode.setAttribute("id", plot.getId());
+ return plot.dataNode; // SVGGElement
+ },
+ initialize: function(){
+ // summary
+ // Initialize the PlotArea.
+
+ this.destroy(); // kill everything first.
+
+ // start with the background
+ this.nodes.main = document.createElement("div");
+
+ this.nodes.area = document.createElementNS(dojo.svg.xmlns.svg, "svg");
+ this.nodes.area.setAttribute("id", this.getId());
+ this.nodes.area.setAttribute("width", this.size.width);
+ this.nodes.area.setAttribute("height", this.size.height);
+ this.nodes.main.appendChild(this.nodes.area);
+
+ var area=this.getArea();
+ var defs = document.createElementNS(dojo.svg.xmlns.svg, "defs");
+ var clip = document.createElementNS(dojo.svg.xmlns.svg, "clipPath");
+ clip.setAttribute("id",this.getId()+"-clip");
+ var rect = document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ rect.setAttribute("x", area.left);
+ rect.setAttribute("y", area.top);
+ rect.setAttribute("width", area.right-area.left);
+ rect.setAttribute("height", area.bottom-area.top);
+ clip.appendChild(rect);
+ defs.appendChild(clip);
+ this.nodes.area.appendChild(defs);
+
+ this.nodes.background = document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ this.nodes.background.setAttribute("id", this.getId()+"-background");
+ this.nodes.background.setAttribute("width", this.size.width);
+ this.nodes.background.setAttribute("height", this.size.height);
+ this.nodes.background.setAttribute("fill", "#fff");
+ this.nodes.area.appendChild(this.nodes.background);
+
+ this.nodes.plots = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ this.nodes.plots.setAttribute("id", this.getId()+"-plots");
+ this.nodes.plots.setAttribute("style","clip-path:url(#"+this.getId()+"-clip);");
+ this.nodes.area.appendChild(this.nodes.plots);
+
+ for(var i=0; i<this.plots.length; i++){
+ this.nodes.plots.appendChild(this.initializePlot(this.plots[i]));
+ }
+
+ // do the axes
+ this.nodes.axes = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ this.nodes.axes.setAttribute("id", this.getId()+"-axes");
+ this.nodes.area.appendChild(this.nodes.axes);
+ var axes = this.getAxes();
+ for(var p in axes){
+ var obj = axes[p];
+ this.nodes.axes.appendChild(obj.axis.initialize(this, obj.plot, obj.drawAgainst, obj.plane));
+ }
+ return this.nodes.main; // HTMLDivElement
+ }
+});
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/PlotArea.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Plotters.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Plotters.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Plotters.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Plotters.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,862 @@
+dojo.provide("dojo.charting.svg.Plotters");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.svg");
+
+// TODO for 0.5: look at replacing manual plotting with dojo.gfx.
+
+// Mixin the SVG-specific plotter object.
+dojo.mixin(dojo.charting.Plotters, {
+ /*********************************************************
+ * Grouped plotters: need all series on a plot at once.
+ *********************************************************/
+ Bar: function(
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* object? */kwArgs,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots a set of grouped bars.
+ // Bindings: y
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ // precompile the data
+ var n = plot.series.length; // how many series
+ var data = [];
+ for(var i=0; i<n; i++){
+ var tmp = plot.series[i].data.evaluate(kwArgs);
+ data.push(tmp);
+ }
+
+ // calculate the width of each bar.
+ var space = 8;
+ var nPoints = data[0].length;
+ var width = ((area.right-area.left)-(space*(nPoints-1)))/nPoints; // the width of each group.
+ var barWidth = width/n; // the width of each bar, no spaces.
+ var yOrigin = plot.axisY.getCoord(plot.axisX.origin, plotarea, plot);
+
+ for(var i=0; i<nPoints; i++){
+ // calculate offset
+ var xStart = area.left+(width*i)+(space*i);
+ for(var j=0; j<n; j++){
+ var value = data[j][i].y;
+ var yA = yOrigin;
+ var x = xStart + (barWidth*j);
+ var y = plot.axisY.getCoord(value, plotarea, plot);
+ var h = Math.abs(yA-y);
+ if(value < plot.axisX.origin){
+ yA = y;
+ y = yOrigin;
+ }
+
+ var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ bar.setAttribute("fill", data[j][i].series.color);
+ bar.setAttribute("stroke-width", "0");
+ bar.setAttribute("x", x);
+ bar.setAttribute("y", y);
+ bar.setAttribute("width", barWidth);
+ bar.setAttribute("height", h);
+ bar.setAttribute("fill-opacity", "0.6");
+ if(applyTo){ applyTo(bar, data[j][i].src); }
+ group.appendChild(bar);
+ }
+ }
+ return group; // SVGGElement
+ },
+ HorizontalBar: function(
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* object? */kwArgs,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots data in a set of grouped bars horizontally.
+ // Bindings: y
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ // precompile the data
+ var n = plot.series.length; // how many series
+ var data = [];
+ for(var i=0; i<n; i++){
+ var tmp = plot.series[i].data.evaluate(kwArgs);
+ data.push(tmp);
+ }
+
+ var space = 6;
+ var nPoints = data[0].length;
+ var h = ((area.bottom-area.top)-(space*(nPoints-1)))/nPoints;
+ var barH = h/n;
+ var xOrigin = plot.axisX.getCoord(0, plotarea, plot);
+
+ for(var i=0; i<nPoints; i++){
+ // calculate offset
+ var yStart = area.top+(h*i)+(space*i);
+ for(var j=0; j<n; j++){
+ var value = data[j][i].y;
+ var y = yStart + (barH*j);
+ var xA = xOrigin;
+ var x = plot.axisX.getCoord(value, plotarea, plot);
+ var w = Math.abs(x-xA);
+ if(value > 0){
+ x = xOrigin;
+ }
+
+ var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ bar.setAttribute("fill", data[j][i].series.color);
+ bar.setAttribute("stroke-width", "0");
+ bar.setAttribute("x", xA);
+ bar.setAttribute("y", y);
+ bar.setAttribute("width", w);
+ bar.setAttribute("height", barH);
+ bar.setAttribute("fill-opacity", "0.6");
+ if(applyTo){ applyTo(bar, data[j][i].src); }
+ group.appendChild(bar);
+ }
+ }
+ return group; // SVGGElement
+ },
+ Gantt: function(
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* object? */kwArgs,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots a grouped set of Gantt bars
+ // Bindings: high/low
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ // precompile the data
+ var n = plot.series.length; // how many series
+ var data = [];
+ for(var i=0; i<n; i++){
+ var tmp = plot.series[i].data.evaluate(kwArgs);
+ data.push(tmp);
+ }
+
+ var space = 2;
+ var nPoints = data[0].length;
+ var h = ((area.bottom-area.top)-(space*(nPoints-1)))/nPoints;
+ var barH = h/n;
+ for(var i=0; i<nPoints; i++){
+ // calculate offset
+ var yStart = area.top+(h*i)+(space*i);
+ for(var j=0; j<n; j++){
+ var high = data[j][i].high;
+ var low = data[j][i].low;
+ if(low > high){
+ var t = high;
+ high = low;
+ low = t;
+ }
+ var x = plot.axisX.getCoord(low, plotarea, plot);
+ var w = plot.axisX.getCoord(high, plotarea, plot) - x;
+ var y = yStart + (barH*j);
+
+ var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ bar.setAttribute("fill", data[j][i].series.color);
+ bar.setAttribute("stroke-width", "0");
+ bar.setAttribute("x", x);
+ bar.setAttribute("y", y);
+ bar.setAttribute("width", w);
+ bar.setAttribute("height", barH);
+ bar.setAttribute("fill-opacity", "0.6");
+ if(applyTo){ applyTo(bar, data[j][i].src); }
+ group.appendChild(bar);
+ }
+ }
+ return group; // SVGGElement
+ },
+ StackedArea: function(
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* object? */kwArgs,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots a set of stacked areas.
+ // Bindings: x/y
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ // precompile the data
+ var n = plot.series.length; // how many series
+ var data = [];
+ var totals = [];
+
+ // we're assuming that all series for this plot has the name x assignment for now.
+ for(var i=0; i<n; i++){
+ var tmp = plot.series[i].data.evaluate(kwArgs);
+ // run through and add current totals
+ for(var j=0; j<tmp.length; j++){
+ if(i==0){ totals.push(tmp[j].y); }
+ else { totals[j] += tmp[j].y; }
+ tmp[j].y = totals[j];
+ }
+ data.push(tmp);
+ }
+
+ for(var i=n-1; i>=0; i--){
+ var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+ path.setAttribute("fill", data[i][0].series.color);
+ path.setAttribute("fill-opacity", "0.4");
+ path.setAttribute("stroke", data[i][0].series.color);
+ path.setAttribute("stroke-width" , "1");
+ path.setAttribute("stroke-opacity", "0.85");
+
+ var cmd = [];
+ var r=3;
+ for(var j=0; j<data[i].length; j++){
+ var values = data[i];
+ var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+ var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+
+ if(j==0){ cmd.push("M"); }
+ else { cmd.push("L"); }
+ cmd.push(x+","+y);
+
+ // points on the line
+ var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+ c.setAttribute("cx",x);
+ c.setAttribute("cy",y);
+ c.setAttribute("r","3");
+ c.setAttribute("fill", values[j].series.color);
+ c.setAttribute("fill-opacity", "0.6");
+ c.setAttribute("stroke-width", "1");
+ c.setAttribute("stroke-opacity", "0.85");
+ group.appendChild(c);
+ if(applyTo){ applyTo(c, data[i].src); }
+ }
+
+ // now run the path backwards from the previous series.
+ if(i == 0){
+ cmd.push("L");
+ cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("L");
+ cmd.push(plot.axisX.getCoord(data[0][0].x, plotarea, plot) + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("Z");
+ } else {
+ var values = data[i-1];
+ cmd.push("L");
+ cmd.push(x + "," + Math.round(plot.axisY.getCoord(values[values.length-1].y, plotarea, plot)));
+ for(var j=values.length-2; j>=0; j--){
+ var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+ var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+ cmd.push("L");
+ cmd.push(x+","+y);
+ }
+ }
+ path.setAttribute("d", cmd.join(" ")+ " Z");
+ group.appendChild(path);
+ }
+ return group; // SVGGElement
+ },
+ StackedCurvedArea: function(
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* object? */kwArgs,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots a set of stacked areas, using a tensioning factor to soften points.
+ // Bindings: x/y
+ var tension = 3;
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ // precompile the data
+ var n = plot.series.length; // how many series
+ var data = [];
+ var totals = [];
+
+ // we're assuming that all series for this plot has the name x assignment for now.
+ for(var i=0; i<n; i++){
+ var tmp = plot.series[i].data.evaluate(kwArgs);
+ // run through and add current totals
+ for(var j=0; j<tmp.length; j++){
+ if(i==0){ totals.push(tmp[j].y); }
+ else { totals[j] += tmp[j].y; }
+ tmp[j].y = totals[j];
+ }
+ data.push(tmp);
+ }
+
+ for(var i=n-1; i>=0; i--){
+ var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+ path.setAttribute("fill", data[i][0].series.color);
+ path.setAttribute("fill-opacity", "0.4");
+ path.setAttribute("stroke", data[i][0].series.color);
+ path.setAttribute("stroke-width" , "1");
+ path.setAttribute("stroke-opacity", "0.85");
+
+ var cmd = [];
+ var r=3;
+ for(var j=0; j<data[i].length; j++){
+ var values = data[i];
+ var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+ var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+ var dx = area.left + 1;
+ var dy = area.bottom;
+ if(j>0){
+ dx = x - plot.axisX.getCoord(values[j-1].x, plotarea, plot);
+ dy = plot.axisY.getCoord(values[j-1].y, plotarea, plot);
+ }
+
+ if(j==0){ cmd.push("M"); }
+ else {
+ cmd.push("C");
+ var cx = x-(tension-1) * (dx/tension);
+ cmd.push(cx + "," + dy);
+ cx = x - (dx/tension);
+ cmd.push(cx + "," + y);
+ }
+ cmd.push(x+","+y);
+
+ // points on the line
+ var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+ c.setAttribute("cx",x);
+ c.setAttribute("cy",y);
+ c.setAttribute("r","3");
+ c.setAttribute("fill", values[j].series.color);
+ c.setAttribute("fill-opacity", "0.6");
+ c.setAttribute("stroke-width", "1");
+ c.setAttribute("stroke-opacity", "0.85");
+ group.appendChild(c);
+ if(applyTo){ applyTo(c, data[i].src); }
+ }
+
+ // now run the path backwards from the previous series.
+ if(i == 0){
+ cmd.push("L");
+ cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("L");
+ cmd.push(plot.axisX.getCoord(data[0][0].x, plotarea, plot) + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("Z");
+ } else {
+ var values = data[i-1];
+ cmd.push("L");
+ cmd.push(x + "," + Math.round(plot.axisY.getCoord(values[values.length-1].y, plotarea, plot)));
+ for(var j=values.length-2; j>=0; j--){
+ var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+ var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+ var dx = x - plot.axisX.getCoord(values[j+1].x, plotarea, plot);
+ var dy = plot.axisY.getCoord(values[j+1].y, plotarea, plot);
+
+ cmd.push("C");
+ var cx = x-(tension-1) * (dx/tension);
+ cmd.push(cx + "," + dy);
+ cx = x - (dx/tension);
+ cmd.push(cx + "," + y);
+ cmd.push(x+","+y);
+ }
+ }
+ path.setAttribute("d", cmd.join(" ")+ " Z");
+ group.appendChild(path);
+ }
+ return group; // SVGGElement
+ },
+
+ /*********************************************************
+ * Single plotters: one series at a time.
+ *********************************************************/
+ DataBar: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots a set of bars in relation to y==0.
+ // Bindings: x/y
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ var n = data.length;
+ var w = (area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower); // the width of each group.
+ var yOrigin = plot.axisY.getCoord(plot.axisX.origin, plotarea, plot);
+
+ for(var i=0; i<n; i++){
+ // calculate offset
+ var value = data[i].y;
+ var yA = yOrigin;
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+ var y = plot.axisY.getCoord(value, plotarea, plot);
+ var h = Math.abs(yA-y);
+ if(value < plot.axisX.origin){
+ yA = y;
+ y = yOrigin;
+ }
+ var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ bar.setAttribute("fill", data[i].series.color);
+ bar.setAttribute("stroke-width", "0");
+ bar.setAttribute("x", x);
+ bar.setAttribute("y", y);
+ bar.setAttribute("width", w);
+ bar.setAttribute("height", h);
+ bar.setAttribute("fill-opacity", "0.6");
+ if(applyTo){ applyTo(bar, data[i].src); }
+ group.appendChild(bar);
+ }
+ return group; // SVGGElement
+ },
+ Line: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as a line.
+ // Bindings: x/y
+ var area = plotarea.getArea();
+ var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+ line.appendChild(path);
+
+ path.setAttribute("fill", "none");
+ path.setAttribute("stroke", data[0].series.color);
+ path.setAttribute("stroke-width" , "2");
+ path.setAttribute("stroke-opacity", "0.85");
+ if(data[0].series.label != null){
+ path.setAttribute("title", data[0].series.label);
+ }
+
+ var cmd=[];
+ for(var i=0; i<data.length; i++){
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+ var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+ if(i==0){ cmd.push("M"); }
+ else { cmd.push("L"); }
+ cmd.push(x+","+y);
+
+ // points on the line
+ var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+ c.setAttribute("cx",x);
+ c.setAttribute("cy",y);
+ c.setAttribute("r","3");
+ c.setAttribute("fill", data[i].series.color);
+ c.setAttribute("fill-opacity", "0.6");
+ c.setAttribute("stroke-width", "1");
+ c.setAttribute("stroke-opacity", "0.85");
+ line.appendChild(c);
+ if(applyTo){ applyTo(c, data[i].src); }
+ }
+ path.setAttribute("d", cmd.join(" "));
+ return line; // SVGGElement
+ },
+ CurvedLine: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as a line with a tension factor for softening.
+ // Bindings: x/y
+ var tension = 3;
+ var area = plotarea.getArea();
+ var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+ line.appendChild(path);
+
+ path.setAttribute("fill", "none");
+ path.setAttribute("stroke", data[0].series.color);
+ path.setAttribute("stroke-width" , "2");
+ path.setAttribute("stroke-opacity", "0.85");
+ if(data[0].series.label != null){
+ path.setAttribute("title", data[0].series.label);
+ }
+
+ var cmd=[];
+ for(var i=0; i<data.length; i++){
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+ var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+ var dx = area.left + 1;
+ var dy = area.bottom;
+ if(i>0){
+ dx = x - plot.axisX.getCoord(data[i-1].x, plotarea, plot);
+ dy = plot.axisY.getCoord(data[i-1].y, plotarea, plot);
+ }
+
+ if(i==0){ cmd.push("M"); }
+ else {
+ cmd.push("C");
+ var cx = x-(tension-1) * (dx/tension);
+ cmd.push(cx + "," + dy);
+ cx = x - (dx/tension);
+ cmd.push(cx + "," + y);
+ }
+ cmd.push(x+","+y);
+
+ // points on the line
+ var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+ c.setAttribute("cx",x);
+ c.setAttribute("cy",y);
+ c.setAttribute("r","3");
+ c.setAttribute("fill", data[i].series.color);
+ c.setAttribute("fill-opacity", "0.6");
+ c.setAttribute("stroke-width", "1");
+ c.setAttribute("stroke-opacity", "0.85");
+ line.appendChild(c);
+ if(applyTo){ applyTo(c, data[i].src); }
+ }
+ path.setAttribute("d", cmd.join(" "));
+ return line; // SVGGElement
+ },
+ Area: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as an area.
+ // Bindings: x/y
+ var area = plotarea.getArea();
+ var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+ line.appendChild(path);
+
+ path.setAttribute("fill", data[0].series.color);
+ path.setAttribute("fill-opacity", "0.4");
+ path.setAttribute("stroke", data[0].series.color);
+ path.setAttribute("stroke-width" , "1");
+ path.setAttribute("stroke-opacity", "0.85");
+ if(data[0].series.label != null){
+ path.setAttribute("title", data[0].series.label);
+ }
+
+ var cmd=[];
+ for(var i=0; i<data.length; i++){
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+ var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+ if(i==0){ cmd.push("M"); }
+ else { cmd.push("L"); }
+ cmd.push(x+","+y);
+
+ // points on the line
+ var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+ c.setAttribute("cx",x);
+ c.setAttribute("cy",y);
+ c.setAttribute("r","3");
+ c.setAttribute("fill", data[i].series.color);
+ c.setAttribute("fill-opacity", "0.6");
+ c.setAttribute("stroke-width", "1");
+ c.setAttribute("stroke-opacity", "0.85");
+ line.appendChild(c);
+ if(applyTo){ applyTo(c, data[i].src); }
+ }
+ // finish it off
+ cmd.push("L");
+ cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("L");
+ cmd.push(plot.axisX.getCoord(data[0].x, plotarea, plot) + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("Z");
+ path.setAttribute("d", cmd.join(" "));
+ return line; // SVGGElement
+ },
+ CurvedArea: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as an area with a tension for softening.
+ // Bindings: x/y
+ var tension = 3;
+ var area = plotarea.getArea();
+ var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+ line.appendChild(path);
+
+ path.setAttribute("fill", data[0].series.color);
+ path.setAttribute("fill-opacity", "0.4");
+ path.setAttribute("stroke", data[0].series.color);
+ path.setAttribute("stroke-width" , "1");
+ path.setAttribute("stroke-opacity", "0.85");
+ if(data[0].series.label != null){
+ path.setAttribute("title", data[0].series.label);
+ }
+
+ var cmd=[];
+ for(var i=0; i<data.length; i++){
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+ var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+ var dx = area.left + 1;
+ var dy = area.bottom;
+ if(i>0){
+ dx = x - plot.axisX.getCoord(data[i-1].x, plotarea, plot);
+ dy = plot.axisY.getCoord(data[i-1].y, plotarea, plot);
+ }
+
+ if(i==0){ cmd.push("M"); }
+ else {
+ cmd.push("C");
+ var cx = x-(tension-1) * (dx/tension);
+ cmd.push(cx + "," + dy);
+ cx = x - (dx/tension);
+ cmd.push(cx + "," + y);
+ }
+ cmd.push(x+","+y);
+
+ // points on the line
+ var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+ c.setAttribute("cx",x);
+ c.setAttribute("cy",y);
+ c.setAttribute("r","3");
+ c.setAttribute("fill", data[i].series.color);
+ c.setAttribute("fill-opacity", "0.6");
+ c.setAttribute("stroke-width", "1");
+ c.setAttribute("stroke-opacity", "0.85");
+ line.appendChild(c);
+ if(applyTo){ applyTo(c, data[i].src); }
+ }
+ // finish it off
+ cmd.push("L");
+ cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("L");
+ cmd.push(plot.axisX.getCoord(data[0].x, plotarea, plot) + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+ cmd.push("Z");
+ path.setAttribute("d", cmd.join(" "));
+ return line; // SVGGElement
+ },
+ HighLow: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as a set of high/low bars.
+ // Bindings: x/high/low
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ var n = data.length;
+ var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+ var w = part*2;
+
+ for(var i=0; i<n; i++){
+ var high = data[i].high;
+ var low = data[i].low;
+ if(low > high){
+ var t = low;
+ low = high;
+ high = t;
+ }
+
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+ var y = plot.axisY.getCoord(high, plotarea, plot);
+ var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+
+ // high + low
+ var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ bar.setAttribute("fill", data[i].series.color);
+ bar.setAttribute("stroke-width", "0");
+ bar.setAttribute("x", x);
+ bar.setAttribute("y", y);
+ bar.setAttribute("width", w);
+ bar.setAttribute("height", h);
+ bar.setAttribute("fill-opacity", "0.6");
+ if(applyTo){ applyTo(bar, data[i].src); }
+ group.appendChild(bar);
+ }
+ return group; // SVGGElement
+ },
+ HighLowClose: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as a set of high/low bars with a close indicator.
+ // Bindings: x/high/low/close
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ var n = data.length;
+ var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+ var w = part*2;
+
+ for(var i=0; i<n; i++){
+ var high = data[i].high;
+ var low = data[i].low;
+ if(low > high){
+ var t = low;
+ low = high;
+ high = t;
+ }
+ var c = data[i].close;
+
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+ var y = plot.axisY.getCoord(high, plotarea, plot);
+ var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+ var close = plot.axisY.getCoord(c, plotarea, plot);
+
+ var g = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ // high + low
+ var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ bar.setAttribute("fill", data[i].series.color);
+ bar.setAttribute("stroke-width", "0");
+ bar.setAttribute("x", x);
+ bar.setAttribute("y", y);
+ bar.setAttribute("width", w);
+ bar.setAttribute("height", h);
+ bar.setAttribute("fill-opacity", "0.6");
+ g.appendChild(bar);
+
+ // close
+ var line=document.createElementNS(dojo.svg.xmlns.svg, "line");
+ line.setAttribute("x1", x);
+ line.setAttribute("x2", x+w+(part*2));
+ line.setAttribute("y1", close);
+ line.setAttribute("y2", close);
+ line.setAttribute("style", "stroke:"+data[i].series.color+";stroke-width:1px;stroke-opacity:0.6;");
+ g.appendChild(line);
+
+ if(applyTo){ applyTo(g, data[i].src); }
+ group.appendChild(g);
+ }
+ return group; // SVGGElement
+ },
+ HighLowOpenClose: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as a set of high/low bars with open and close indicators.
+ // Bindings: x/high/low/open/close
+ var area = plotarea.getArea();
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ var n = data.length;
+ var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+ var w = part*2;
+
+ for(var i=0; i<n; i++){
+ var high = data[i].high;
+ var low = data[i].low;
+ if(low > high){
+ var t = low;
+ low = high;
+ high = t;
+ }
+ var o = data[i].open;
+ var c = data[i].close;
+
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+ var y = plot.axisY.getCoord(high, plotarea, plot);
+ var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+ var open = plot.axisY.getCoord(o, plotarea, plot);
+ var close = plot.axisY.getCoord(c, plotarea, plot);
+
+ var g = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+ // high + low
+ var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+ bar.setAttribute("fill", data[i].series.color);
+ bar.setAttribute("stroke-width", "0");
+ bar.setAttribute("x", x);
+ bar.setAttribute("y", y);
+ bar.setAttribute("width", w);
+ bar.setAttribute("height", h);
+ bar.setAttribute("fill-opacity", "0.6");
+ g.appendChild(bar);
+
+ // open
+ var line=document.createElementNS(dojo.svg.xmlns.svg, "line");
+ line.setAttribute("x1", x-(part*2));
+ line.setAttribute("x2", x+w);
+ line.setAttribute("y1", open);
+ line.setAttribute("y2", open);
+ line.setAttribute("style", "stroke:"+data[i].series.color+";stroke-width:1px;stroke-opacity:0.6;");
+ g.appendChild(line);
+
+ // close
+ var line=document.createElementNS(dojo.svg.xmlns.svg, "line");
+ line.setAttribute("x1", x);
+ line.setAttribute("x2", x+w+(part*2));
+ line.setAttribute("y1", close);
+ line.setAttribute("y2", close);
+ line.setAttribute("style", "stroke:"+data[i].series.color+";stroke-width:1px;stroke-opacity:0.6;");
+ g.appendChild(line);
+
+ if(applyTo){ applyTo(g, data[i].src); }
+ group.appendChild(g);
+ }
+ return group; // SVGGElement
+ },
+ Scatter: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as a set of points.
+ // Bindings: x/y
+ var r=7;
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ for (var i=0; i<data.length; i++){
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+ var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+ var point = document.createElementNS(dojo.svg.xmlns.svg, "path");
+ point.setAttribute("fill", data[i].series.color);
+ point.setAttribute("stroke-width", "0");
+ point.setAttribute("d",
+ "M " + x + "," + (y-r) + " " +
+ "Q " + x + "," + y + " " + (x+r) + "," + y + " " +
+ "Q " + x + "," + y + " " + x + "," + (y+r) + " " +
+ "Q " + x + "," + y + " " + (x-r) + "," + y + " " +
+ "Q " + x + "," + y + " " + x + "," + (y-r) + " " +
+ "Z"
+ );
+ if(applyTo){ applyTo(point, data[i].src); }
+ group.appendChild(point);
+ }
+ return group; // SVGGElement
+ },
+ Bubble: function(
+ /* array */data,
+ /* dojo.charting.PlotArea */plotarea,
+ /* dojo.charting.Plot */plot,
+ /* function? */applyTo
+ ){
+ // summary
+ // Plots the series as a set of points with a size factor.
+ // Bindings: x/y/size
+ var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+ var sizeFactor=1;
+ for (var i=0; i<data.length; i++){
+ var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+ var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+ if(i==0){
+ // figure out the size factor, start with the axis with the greater range.
+ var raw = data[i].size;
+ var dy = plot.axisY.getCoord(data[i].y + raw, plotarea, plot)-y;
+ sizeFactor = dy/raw;
+ }
+ if(sizeFactor<1) { sizeFactor = 1; }
+ var point = document.createElementNS(dojo.svg.xmlns.svg, "circle");
+ point.setAttribute("fill", data[i].series.color);
+ point.setAttribute("fill-opacity", "0.8");
+ point.setAttribute("stroke", data[i].series.color);
+ point.setAttribute("stroke-width", "1");
+ point.setAttribute("cx",x);
+ point.setAttribute("cy",y);
+ point.setAttribute("r", (data[i].size/2)*sizeFactor);
+ if(applyTo){ applyTo(point, data[i].src); }
+ group.appendChild(point);
+ }
+ return group; // SVGGElement
+ }
+});
+dojo.charting.Plotters["Default"] = dojo.charting.Plotters.Line;
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/svg/Plotters.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/Axis.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/Axis.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/Axis.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/Axis.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,260 @@
+dojo.provide("dojo.charting.vml.Axis");
+dojo.require("dojo.lang.common");
+
+dojo.extend(dojo.charting.Axis, {
+ renderLines: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* string */plane
+ ){
+ // summary
+ // Renders any reference lines for this axis.
+ if(this.nodes.lines){
+ while(this.nodes.lines.childNodes.length > 0){
+ this.nodes.lines.removeChild(this.nodes.lines.childNodes[0]);
+ }
+ if(this.nodes.lines.parentNode){
+ this.nodes.lines.parentNode.removeChild(this.nodes.lines);
+ this.nodes.lines = null;
+ }
+ }
+
+ var area = plotArea.getArea();
+ var g = this.nodes.lines = document.createElement("div");
+ g.setAttribute("id", this.getId()+"-lines");
+ for(var i=0; i<this._labels.length; i++){
+ if (this._labels[i].value == this.origin){ continue; }
+
+ var v = this.getCoord(this._labels[i].value, plotArea, plot);
+ var l=document.createElement("v:line");
+ var str=document.createElement("v:stroke");
+ str.dashstyle="dot";
+ l.appendChild(str);
+ l.setAttribute("strokecolor", "#666");
+ l.setAttribute("strokeweight", "1px");
+ var s=l.style;
+ s.position="absolute";
+ s.top="0px";
+ s.left="0px";
+ s.antialias="false";
+ if(plane == "x"){
+ l.setAttribute("from", v+"px,"+area.top+"px");
+ l.setAttribute("to", v+"px,"+area.bottom+"px");
+ }
+ else if (plane == "y"){
+ l.setAttribute("from", area.left+"px,"+v+"px");
+ l.setAttribute("to", area.right+"px,"+v+"px");
+ }
+ g.appendChild(l);
+ }
+ return g; // HTMLDivElement
+ },
+ renderTicks: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* string */plane,
+ /* float */coord
+ ){
+ // summary
+ // Renders any tick lines for this axis.
+ if(this.nodes.ticks){
+ while(this.nodes.ticks.childNodes.length > 0){
+ this.nodes.ticks.removeChild(this.nodes.ticks.childNodes[0]);
+ }
+ if(this.nodes.ticks.parentNode){
+ this.nodes.ticks.parentNode.removeChild(this.nodes.ticks);
+ this.nodes.ticks = null;
+ }
+ }
+
+ var g = this.nodes.ticks = document.createElement("div");
+ g.setAttribute("id", this.getId()+"-ticks");
+ for(var i=0; i<this._labels.length; i++){
+ var v = this.getCoord(this._labels[i].value, plotArea, plot);
+
+ var l=document.createElement("v:line");
+ l.setAttribute("strokecolor", "#000");
+ l.setAttribute("strokeweight", "1px");
+ var s=l.style;
+ s.position="absolute";
+ s.top="0px";
+ s.left="0px";
+ s.antialias="false";
+ if(plane == "x"){
+ l.setAttribute("from", v+"px,"+coord+"px");
+ l.setAttribute("to", v+"px,"+(coord+3)+"px");
+ }
+ else if (plane == "y"){
+ l.setAttribute("from", (coord-2)+"px,"+v+"px");
+ l.setAttribute("to", (coord+2)+"px,"+v+"px");
+ }
+ g.appendChild(l);
+ }
+ return g; // HTMLDivElement
+ },
+ renderLabels: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* string */plane,
+ /* float */coord,
+ /* int */textSize,
+ /* string */anchor
+ ){
+ // summary
+ // Render all labels for this axis.
+ function createLabel(label, x, y, textSize, anchor){
+ var text = document.createElement("div");
+ var s=text.style;
+ text.innerHTML=label;
+ s.fontSize=textSize+"px";
+ s.fontFamily="sans-serif";
+ s.position="absolute";
+ s.top = y+"px";
+ if(anchor == "center"){
+ s.left = x + "px";
+ s.textAlign="center";
+ } else if (anchor == "left"){
+ s.left = x + "px";
+ s.textAlign="left";
+ } else if (anchor == "right"){
+ s.right = x + "px";
+ s.textAlign="right";
+ }
+ return text;
+ };
+
+ // wipe if needed
+ if(this.nodes.labels){
+ while(this.nodes.labels.childNodes.length > 0){
+ this.nodes.labels.removeChild(this.nodes.labels.childNodes[0]);
+ }
+ if(this.nodes.labels.parentNode){
+ this.nodes.labels.parentNode.removeChild(this.nodes.labels);
+ this.nodes.labels = null;
+ }
+ }
+ var g = this.nodes.labels = document.createElement("div");
+ g.setAttribute("id", this.getId()+"-labels");
+
+ for(var i=0; i<this._labels.length; i++){
+ var v = this.getCoord(this._labels[i].value, plotArea, plot);
+ if(plane == "x"){
+ // ugly hack but it works.
+ var node=createLabel(this._labels[i].label, v, coord, textSize, anchor);
+ document.body.appendChild(node);
+ node.style.left = v-(node.offsetWidth/2)+"px";
+ g.appendChild(node);
+ }
+ else if (plane == "y"){
+ var node = createLabel(this._labels[i].label, coord, v, textSize, anchor);
+ document.body.appendChild(node);
+ node.style.top = v-(node.offsetHeight/2)+"px";
+ g.appendChild(node);
+ }
+ }
+ return g; // HTMLDivElement
+ },
+ render: function(
+ /* dojo.charting.PlotArea */plotArea,
+ /* dojo.charting.Plot */plot,
+ /* dojo.charting.Axis */drawAgainst,
+ /* string */plane
+ ){
+ // summary
+ // Renders this axis to the given plot.
+
+ // get the origin plot point.
+ var area = plotArea.getArea();
+ var stroke = 1;
+ var style = "stroke:#000;stroke-width:"+stroke+"px;";
+ var textSize=10;
+ var coord = drawAgainst.getCoord(this.origin, plotArea, plot);
+
+ // draw the axis.
+ var g = this.nodes.main = document.createElement("div");
+ g.setAttribute("id", this.getId()); // need a handle if we have to kill parts of the axis def.
+ var line = this.nodes.axis = document.createElement("v:line");
+ line.setAttribute("strokecolor", "#000");
+ line.setAttribute("strokeweight", stroke+"px");
+ var s=line.style;
+ s.position="absolute";
+ s.top="0px";
+ s.left="0px";
+ s.antialias="false";
+ if(plane == "x"){
+ line.setAttribute("from", area.left+"px,"+coord+"px");
+ line.setAttribute("to", area.right+"px,"+coord+"px");
+
+ // set up the labels
+ var y = coord + Math.floor(textSize/2);
+ if(this.showLines){
+ g.appendChild(this.renderLines(plotArea, plot, plane, y));
+ }
+ if(this.showTicks){
+ g.appendChild(this.renderTicks(plotArea, plot, plane, coord));
+ }
+ if(this.showLabels){
+ g.appendChild(this.renderLabels(plotArea, plot, plane, y, textSize, "center"));
+ }
+ if(this.showLabel && this.label){
+ var x = plotArea.size.width/2;
+ var y = coord + Math.round(textSize*1.5);
+ var text = document.createElement("div");
+ var s=text.style;
+ text.innerHTML=this.label;
+ s.fontSize=(textSize+2)+"px";
+ s.fontFamily="sans-serif";
+ s.fontWeight="bold";
+ s.position="absolute";
+ s.top = y+"px";
+ s.left = x + "px";
+ s.textAlign="center";
+ document.body.appendChild(text);
+ text.style.left = x-(text.offsetWidth/2)+"px";
+ g.appendChild(text);
+ }
+ } else {
+ line.setAttribute("from", coord+"px,"+area.top+"px");
+ line.setAttribute("to", coord+"px,"+area.bottom+"px");
+
+ // set up the labels
+ var isMax = this.origin == drawAgainst.range.upper;
+ var x = coord+4;
+ var anchor = "left";
+ if(!isMax){
+ x = area.right-coord+textSize+4;
+ anchor = "right";
+ if(coord == area.left){ x += (textSize*2)-(textSize/2); }
+ }
+ if(this.showLines){
+ g.appendChild(this.renderLines(plotArea, plot, plane, x));
+ }
+ if(this.showTicks){
+ g.appendChild(this.renderTicks(plotArea, plot, plane, coord));
+ }
+ if(this.showLabels){
+ g.appendChild(this.renderLabels(plotArea, plot, plane, x, textSize, anchor));
+ }
+ if(this.showLabel && this.label){
+ x += (textSize*2)-2;
+ var y = plotArea.size.height/2;
+ var text = document.createElement("div");
+ var s=text.style;
+ text.innerHTML=this.label;
+ s.fontSize=(textSize+2)+"px";
+ s.fontFamily="sans-serif";
+ s.fontWeight="bold";
+ s.position="absolute";
+ s.height = plotArea.size.height+"px";
+ s.writingMode = "tb-rl";
+ s.textAlign="center";
+ s[anchor] = x+"px";
+ document.body.appendChild(text);
+ s.top = y-(text.offsetHeight/2)+"px";
+ g.appendChild(text);
+ }
+ }
+ g.appendChild(line);
+ return g; // HTMLDivElement
+ }
+});
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/Axis.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/PlotArea.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/PlotArea.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/PlotArea.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/PlotArea.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,68 @@
+dojo.provide("dojo.charting.vml.PlotArea");
+dojo.require("dojo.lang.common");
+
+dojo.extend(dojo.charting.PlotArea, {
+ initializePlot: function(plot){
+ // summary
+ // Initialize the plot node for data rendering.
+ plot.destroy();
+ plot.dataNode = document.createElement("div");
+ plot.dataNode.id = plot.getId();
+ return plot.dataNode; // HTMLDivElement
+ },
+ initialize:function(){
+ // summary
+ // Initialize the PlotArea.
+
+ this.destroy(); // kill everything first.
+ var main = this.nodes.main = document.createElement("div");
+
+ // start with the background
+ var area = this.nodes.area = document.createElement("div");
+ area.id = this.getId();
+ area.style.width=this.size.width+"px";
+ area.style.height=this.size.height+"px";
+ area.style.position="absolute";
+ main.appendChild(area);
+
+ var bg = this.nodes.background = document.createElement("div");
+ bg.id = this.getId()+"-background";
+ bg.style.width=this.size.width+"px";
+ bg.style.height=this.size.height+"px";
+ bg.style.position="absolute";
+ bg.style.top="0px";
+ bg.style.left="0px";
+ bg.style.backgroundColor="#fff";
+ area.appendChild(bg);
+
+ // the plot group
+ var a=this.getArea();
+ var plots = this.nodes.plots = document.createElement("div");
+ plots.id = this.getId()+"-plots";
+ plots.style.width=this.size.width+"px";
+ plots.style.height=this.size.height+"px";
+ plots.style.position="absolute";
+ plots.style.top="0px";
+ plots.style.left="0px";
+ plots.style.clip="rect("
+ + a.top+" "
+ + a.right+" "
+ + a.bottom+" "
+ + a.left
+ +")";
+ area.appendChild(plots);
+ for(var i=0; i<this.plots.length; i++){
+ plots.appendChild(this.initializePlot(this.plots[i]));
+ }
+
+ var axes = this.nodes.axes = document.createElement("div");
+ axes.id = this.getId() + "-axes";
+ area.appendChild(axes);
+ var ax = this.getAxes();
+ for(var p in ax){
+ var obj = ax[p];
+ axes.appendChild(obj.axis.initialize(this, obj.plot, obj.drawAgainst, obj.plane));
+ }
+ return main; // HTMLDivElement
+ }
+});
Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/PlotArea.js
------------------------------------------------------------------------------
svn:eol-style = native