package org.ripple.power.ui.graphics.chart; import java.awt.Frame; import java.util.ArrayList; import org.ripple.power.ui.graphics.LColor; import org.ripple.power.ui.graphics.LFont; import org.ripple.power.ui.graphics.geom.RectF; public class BarChartCanvas extends ChartBaseCanvas { /** * */ private static final long serialVersionUID = 1L; private ArrayList<ChartValueSerie> mSeries = new ArrayList<ChartValueSerie>(); private int mXnum = 0; private int mLabelMaxNum = 10; private float gX = 1; private Paint mPnt = new Paint(); private Paint mPntFill = new Paint(); public static class TextDisplay { public int x; public int y; public LColor color = LColor.yellow; public String message; public LFont font = LFont.getFont(12); } private TextDisplay _display; public void setTextDisplay(TextDisplay d) { _display = d; } public BarChartCanvas(int w, int h) { super(w, h); } public BarChartCanvas(Frame f) { super(f); } public void onDraw(Canvas cnv) { if ((mBmp == null) || (bRedraw)) { getViewSizes(); getXYminmax(); if (p_yscale_auto) { calcYgridRange(); } calcXYcoefs(); gX = (float) aX / (1 + mSeries.size()); 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, null); } 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() { 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; } } } protected void drawData() { float pY, zY; ChartValueSerie serie; for (int jj = 0; jj < mSeries.size(); jj++) { serie = mSeries.get(jj); 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 ii = 0; ii < serie.mPointList.size(); ii++) { pY = serie.mPointList.get(ii).y; int color = serie.mPointList.get(ii).color; if (serie.mPointList.get(ii).color != -1) { mPntFill.setColor(color); mPnt.setColor(color); } zY = eY + bY * aY; if (zY > eY) { zY = eY; } else if (zY < sY) { zY = sY; } if (!Float.isNaN(pY)) { RectF rect = new RectF( (sX + gX / 2 + jj * gX + ii * aX + 1), zY, (sX + gX / 2 + jj * gX + ii * aX + gX), (eY - (pY - bY) * aY)); mCnv.drawRect(rect.left + offsetX, rect.top + offsetY, rect.right + offsetX, rect.bottom + offsetY, mPntFill); mCnv.drawRect(rect.left + offsetX, rect.top + offsetY, rect.right + offsetX, rect.bottom + offsetY, 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); if (_display != null && _display.message != null && _display.message.length() > 0) { LColor old = mCnv._graphics.getLColor(); mCnv._graphics.setColor(_display.color); LFont font = mCnv._graphics.getLFont(); mCnv._graphics.setFont(_display.font); mCnv._graphics.drawString(_display.message, _display.x, _display.y); mCnv._graphics.setColor(old); mCnv._graphics.setFont(font); } } }