package org.ripple.power.ui.graphics.chart;
import java.util.ArrayList;
public class StyledXyChartCanvas extends ChartBaseCanvas {
/**
*
*/
private static final long serialVersionUID = 1L;
private ArrayList<StyledChartPointSerie> mSeries = new ArrayList<StyledChartPointSerie>();
private Paint mLinePnt = new Paint();
private Paint mFillPnt = new Paint();
private Paint mMarkPnt = new Paint();
public StyledXyChartCanvas(int w, int h) {
super(w, h);
}
public void onDraw(Canvas cnv) {
if ((mBmp == null) || (bRedraw)) {
getViewSizes();
getXYminmax();
if (p_xscale_auto)
calcXgridRange();
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(StyledChartPointSerie serie) {
mSeries.add(serie);
bRedraw = true;
}
public ArrayList<StyledChartPointSerie> getSeries() {
return mSeries;
}
public void setLineVis(int index, boolean show) {
mSeries.get(index).setVisible(show);
bRedraw = true;
}
public void setLineStyle(int index, float size) {
mSeries.get(index).setStyle(size);
bRedraw = true;
}
public void setLineStyle(int index, float size, boolean usedip) {
mSeries.get(index).setStyle(size, usedip);
bRedraw = true;
}
protected void getXYminmax() {
StyledChartPointSerie serie;
for (int ii = 0; ii < mSeries.size(); ii++) {
serie = mSeries.get(ii);
if (ii == 0) {
mXmin = serie.mXmin;
mXmax = serie.mXmax;
mYmin = serie.mYmin;
mYmax = serie.mYmax;
} else {
if (serie.mXmin < mXmin)
mXmin = serie.mXmin;
if (serie.mXmax > mXmax)
mXmax = serie.mXmax;
if (serie.mYmin < mYmin)
mYmin = serie.mYmin;
if (serie.mYmax > mYmax)
mYmax = serie.mYmax;
}
}
}
protected void drawData() {
float qX = 0, qY = 0, pX = 0, pY = 0;
boolean pValid;
StyledChartPoint point;
mLinePnt.reset();
mFillPnt.reset();
mMarkPnt.reset();
mLinePnt.setStyle(Style.STROKE);
mFillPnt.setStyle(Style.FILL);
mMarkPnt.setStyle(Style.FILL);
mLinePnt.setAntiAlias(true);
mMarkPnt.setAntiAlias(false);
mFillPnt.setAntiAlias(false);
for (StyledChartPointSerie serie : mSeries) {
if (serie.isVisible()) {
if (serie.mUseDip)
mLinePnt.setStrokeWidth(dipToPixel(serie.mWidth));
else
mLinePnt.setStrokeWidth(serie.mWidth);
pValid = false;
for (int ii = 0; ii < serie.mPointList.size(); ii++) {
point = serie.mPointList.get(ii);
pX = point.x;
pY = point.y;
if (Float.isNaN(pX) || Float.isNaN(pY)) {
pValid = false;
} else if (!pValid) {
if (point.markColor != 0) {
mMarkPnt.setColor(point.markColor);
mCnv.drawCircle(sX + (pX - bX) * aX, eY - (pY - bY)
* aY, point.markSize, mMarkPnt);
}
pValid = true;
} else {
if (point.fillColor != 0) {
mFillPnt.setColor(point.fillColor);
mPath.reset();
mPath.moveTo(sX + (qX - bX) * aX, eY);
mPath.lineTo(sX + (qX - bX) * aX, eY - (qY - bY)
* aY);
mPath.lineTo(sX + (pX - bX) * aX, eY - (pY - bY)
* aY);
mPath.lineTo(sX + (pX - bX) * aX, eY);
mPath.close();
mCnv.drawPath(mPath, mFillPnt);
}
mLinePnt.setColor(point.lineColor);
mCnv.drawLine(sX + (qX - bX) * aX, eY - (qY - bY) * aY,
sX + (pX - bX) * aX, eY - (pY - bY) * aY,
mLinePnt);
if (point.markColor != 0) {
mMarkPnt.setColor(point.markColor);
mCnv.drawCircle(sX + (pX - bX) * aX, eY - (pY - bY)
* aY, point.markSize, mMarkPnt);
}
}
qX = pX;
qY = pY;
}
}
}
}
}