package org.ripple.power.ui.graphics.chart;
import java.util.ArrayList;
public class StackedLineChartCanvas extends ChartBaseCanvas {
/**
*
*/
private static final long serialVersionUID = 1L;
private ArrayList<ChartValueSerie> mSeries = new ArrayList<ChartValueSerie>();
private ChartValueSerie mStacked = new ChartValueSerie();
private int mXnum = 0;
private int mLabelMaxNum = 10;
private Paint mPnt = new Paint();
private Paint mPntFill = new Paint();
private Path mPathFill;
public StackedLineChartCanvas(int w, int h) {
super(w, h);
}
public void onDraw(Canvas cnv) {
if ((mBmp == null) || (bRedraw)) {
getViewSizes();
getXYminmax();
if (p_yscale_auto) {
calcYgridRange();
}
calcXYcoefs();
reset();
drawData();
if (p_grid_vis)
drawGrid();
if (p_xtext_vis)
drawXlabel();
if (p_ytext_vis)
drawYlabel();
if (p_border_vis)
drawBorder();
if (p_axis_vis)
drawAxis();
bRedraw = false;
}
cnv.drawBitmap(mBmp, 0, 0);
}
public void clearSeries() {
while (mSeries.size() > 0) {
mSeries.remove(0);
}
bRedraw = true;
}
public void addSerie(ChartValueSerie serie) {
mSeries.add(serie);
bRedraw = true;
}
public ArrayList<ChartValueSerie> getSeries() {
return mSeries;
}
public void setLineVis(int index, boolean show) {
mSeries.get(index).setVisible(show);
bRedraw = true;
}
public void setLineStyle(int index, int color, float size) {
mSeries.get(index).setStyle(color, size);
bRedraw = true;
}
public void setLineStyle(int index, int color, float size, boolean usedip) {
mSeries.get(index).setStyle(color, size, usedip);
bRedraw = true;
}
public void setLineStyle(int index, int color, int fillcolor, float size,
boolean usedip) {
mSeries.get(index).setStyle(color, fillcolor, size, usedip);
bRedraw = true;
}
public void setLabelMaxNum(int maxnum) {
if (maxnum <= 0) {
return;
}
mLabelMaxNum = maxnum;
bRedraw = true;
}
protected void getXYminmax() {
calcStackedSerie();
mXnum = mStacked.getSize();
mYmax = mStacked.mYmax;
ChartValueSerie serie;
for (int ii = 0; ii < mSeries.size(); ii++) {
serie = mSeries.get(ii);
if (ii == 0) {
mYmin = serie.mYmin;
} else {
if (serie.mYmin < mYmin)
mYmin = serie.mYmin;
}
}
}
protected void drawData() {
ChartValueSerie serie;
ChartValue v;
float pY;
for (int ii = mSeries.size() - 1; ii >= 0; ii--) {
serie = mSeries.get(ii);
if (serie.isVisible()) {
mPnt.reset();
mPnt.setStyle(Style.STROKE);
mPnt.setColor(serie.mColor);
mPntFill.reset();
mPntFill.setStyle(Style.FILL);
mPntFill.setColor(serie.mFillColor);
if (serie.mUseDip) {
mPnt.setStrokeWidth(dipToPixel(serie.mWidth));
} else {
mPnt.setStrokeWidth(serie.mWidth);
}
mPnt.setAntiAlias(true);
mPntFill.setAntiAlias(false);
for (int jj = 0; jj < mStacked.mPointList.size(); jj++) {
v = mStacked.mPointList.get(jj);
pY = v.y;
if (jj == 0) {
mPath.reset();
mPath.moveTo(sX + bX + jj * aX, eY - (pY - bY) * aY);
} else {
mPath.lineTo(sX + bX + jj * aX, eY - (pY - bY) * aY);
}
mStacked.updatePoint(jj, v.y - serie.getPoint(jj).y);
}
if (serie.mFillColor != 0) {
mPathFill = new Path(mPath);
mPathFill.lineTo(sX + bX + (mStacked.mPointList.size() - 1)
* aX, eY);
mPathFill.lineTo(sX + bX, eY);
mPathFill.close();
mCnv.drawPath(mPathFill, mPntFill);
}
mCnv.drawPath(mPath, mPnt);
}
}
}
protected void calcXYcoefs() {
aX = (float) dX / mXnum;
bX = (float) aX / 2;
aY = (float) dY / Math.abs(mYmaxGrid - mYminGrid);
bY = (float) mYminGrid;
}
protected void drawXlabel() {
mPntText.setTextAlign(Align.CENTER);
mPath.reset();
ChartValueSerie mLabel = mSeries.get(0);
String label;
int numlab = mLabel.getSize();
int numdiv = 1 + (numlab - 1) / mLabelMaxNum;
if (p_xtext_bottom) {
for (int ii = 0; ii < mLabel.getSize(); ii++) {
mPath.moveTo(sX + bX + ii * aX, eY - 3);
mPath.lineTo(sX + bX + ii * aX, eY + 3);
label = mLabel.mPointList.get(ii).t;
if ((label != null) && (ii < numlab) && ((ii % numdiv) == 0))
mCnv.drawText(label, sX + bX + ii * aX, eY + p_text_size
+ 2, mPntText);
}
} else {
for (int ii = 0; ii < mLabel.getSize(); ii++) {
mPath.moveTo(sX + bX + ii * aX, sY - 3);
mPath.lineTo(sX + bX + ii * aX, sY + 3);
label = mLabel.mPointList.get(ii).t;
if ((label != null) && (ii < numlab) && ((ii % numdiv) == 0))
mCnv.drawText(label, sX + bX + ii * aX, sY - p_text_size
+ 3, mPntText);
}
}
mCnv.drawPath(mPath, mPntAxis);
}
protected void calcStackedSerie() {
if (mSeries.size() == 0) {
return;
}
mStacked.clearPointList();
ChartValueSerie f = mSeries.get(0);
float acc = 0;
for (int ii = 0; ii < f.getSize(); ii++) {
if (f.isVisible())
acc = f.getPoint(ii).y;
else
acc = 0;
for (int jj = 1; jj < mSeries.size(); jj++) {
if ((mSeries.get(jj).isVisible())
&& (ii < mSeries.get(jj).getSize()))
acc += mSeries.get(jj).getPoint(ii).y;
}
mStacked.addPoint(new ChartValue(null, acc));
}
}
}