package org.ripple.power.ui.graphics.chart; import java.awt.Frame; import java.util.ArrayList; public class LineChartCanvas extends ChartBaseCanvas { /** * */ private static final long serialVersionUID = 1L; private ArrayList<LineChartCanvas> mJoinLines = new ArrayList<LineChartCanvas>( 100); private ArrayList<ChartValueSerie> mSeries = new ArrayList<ChartValueSerie>(); private int mXnum = 0; private int mLabelMaxNum = 10; private Paint mPnt = new Paint(); public LineChartCanvas(Frame frame) { super(frame); } public LineChartCanvas(int w, int h) { super(w, h); } public void onDraw(Canvas cnv) { if ((mBmp == null) || (bRedraw)) { getViewSizes(); getXYminmax(); if (p_yscale_auto) { calcYgridRange(); } calcXYcoefs(); mBmp = Bitmap.createBitmap(p_width, p_height); mCnv = new Canvas(mBmp); 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(); } drawData(); if (mJoinLines.size() > 0) { for (LineChartCanvas c : mJoinLines) { if (c != null) { c.drawLine(mCnv); } } } 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 setLabelMaxNum(int maxnum) { if (maxnum <= 0) { return; } mLabelMaxNum = maxnum; bRedraw = true; } public void joinLine(LineChartCanvas line) { mJoinLines.add(line); } public void joinRemove(LineChartCanvas line) { mJoinLines.remove(line); } protected void getXYminmax() { ChartValueSerie serie; for (int ii = 0; ii < mSeries.size(); ii++) { serie = mSeries.get(ii); if (ii == 0) { mXnum = serie.getSize(); mYmin = serie.mYmin; mYmax = serie.mYmax; } else { if (serie.getSize() > mXnum) mXnum = serie.getSize(); if (serie.mYmin < mYmin) mYmin = serie.mYmin; if (serie.mYmax > mYmax) mYmax = serie.mYmax; } } } private void drawLine(Canvas c) { getViewSizes(); getXYminmax(); if (p_yscale_auto) { calcYgridRange(); } calcXYcoefs(); float pY; boolean pValid; for (ChartValueSerie serie : mSeries) { if (serie.isVisible()) { mPnt.reset(); mPnt.setStyle(Style.STROKE); mPnt.setColor(serie.mColor); if (serie.mUseDip) { mPnt.setStrokeWidth(dipToPixel(serie.mWidth)); } else { mPnt.setStrokeWidth(serie.mWidth); } mPnt.setAntiAlias(true); pValid = false; mPath.reset(); for (int ii = 0; ii < serie.mPointList.size(); ii++) { pY = serie.mPointList.get(ii).y; if (Float.isNaN(pY)) { pValid = false; } else if (!pValid) { mPath.moveTo(sX + bX + ii * aX, eY - (pY - bY) * aY); pValid = true; } else { mPath.lineTo(sX + bX + ii * aX, eY - (pY - bY) * aY); } } c.drawPath(mPath, mPnt); } } } protected void drawData() { float pY; boolean pValid; for (ChartValueSerie serie : mSeries) { if (serie.isVisible()) { mPnt.reset(); mPnt.setStyle(Style.STROKE); mPnt.setColor(serie.mColor); if (serie.mUseDip) { mPnt.setStrokeWidth(dipToPixel(serie.mWidth)); } else mPnt.setStrokeWidth(serie.mWidth); mPnt.setAntiAlias(true); pValid = false; mPath.reset(); for (int ii = 0; ii < serie.mPointList.size(); ii++) { pY = serie.mPointList.get(ii).y; if (Float.isNaN(pY)) { pValid = false; } else if (!pValid) { mPath.moveTo(sX + bX + ii * aX, eY - (pY - bY) * aY); pValid = true; } else { mPath.lineTo(sX + bX + ii * aX, eY - (pY - bY) * aY); } } 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); } }