package uk.org.smithfamily.mslogger.widgets.renderers;
import uk.org.smithfamily.mslogger.dashboards.DashboardView;
import uk.org.smithfamily.mslogger.widgets.*;
import uk.org.smithfamily.mslogger.widgets.Indicator.DisplayType;
import uk.org.smithfamily.mslogger.widgets.Indicator.Orientation;
import android.content.Context;
import android.graphics.*;
/**
*
*/
public class BarGraph extends Painter
{
public BarGraph(final DashboardView parent, final Indicator model, final Context c)
{
super(parent, model, c);
}
private Paint barPaint;
private Paint titlePaint;
private Paint valuePaint;
@Override
protected void init(final Context c)
{
initDrawingTools(c);
}
/**
*
* @param context
*/
private void initDrawingTools(final Context context)
{
int anti_alias_flag = Paint.ANTI_ALIAS_FLAG;
if (parent.isInEditMode())
{
anti_alias_flag = 0;
}
titlePaint = new Paint();
titlePaint.setColor(Color.WHITE);
titlePaint.setTextAlign(Paint.Align.LEFT);
titlePaint.setTextSize(0.06f);
titlePaint.setFlags(anti_alias_flag);
titlePaint.setLinearText(true);
titlePaint.setAntiAlias(true);
valuePaint = new Paint();
valuePaint.setColor(Color.WHITE);
valuePaint.setTextSize(0.06f);
valuePaint.setTextAlign(Paint.Align.RIGHT);
valuePaint.setFlags(anti_alias_flag);
valuePaint.setLinearText(true);
valuePaint.setAntiAlias(true);
barPaint = new Paint();
barPaint.setColor(Color.BLACK);
}
/**
* @param canvas
*/
@Override
public void renderFrame(final Canvas canvas)
{
final int height = (int) (bottom - top);
final int width = (int) (right - left);
if ((width == 0) || (height == 0))
{// We're not ready to do this yet
return;
}
final float scale = Math.min(height, width);
canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.translate(left, top);
canvas.scale(scale, scale);
drawBars(canvas);
if (model.isDisabled())
{
model.setValue(model.getMin());
}
else
{
drawValue(canvas);
}
drawTitle(canvas);
canvas.restore();
}
public void drawValue(final Canvas canvas)
{
valuePaint.setColor(getFgColour());
final float displayValue = (float) (Math.floor((model.getValue() / Math.pow(10, -model.getVd())) + 0.5) * Math.pow(10, -model.getVd()));
String text;
if (model.getVd() <= 0)
{
text = Integer.toString((int) displayValue);
}
else
{
text = Float.toString(displayValue);
}
canvas.drawText(text, 0.9f, 0.95f, valuePaint);
}
public void drawTitle(final Canvas canvas)
{
titlePaint.setColor(getFgColour());
String text = model.getTitle();
if (!model.getUnits().equals(""))
{
text += " (" + model.getUnits() + ")";
}
canvas.drawText(text, 0.05f, 0.95f, titlePaint);
}
public void drawBars(final Canvas canvas)
{
final double percent = ((model.getValue() - model.getMin()) / (model.getMax() - model.getMin())) * 100;
barPaint.setColor(Color.WHITE);
barPaint.setColor(getBarColour((((model.getMax() - model.getMin()) / 100) * percent) + model.getMin()));
final float barWidth = 0.025f;
final float barSpacing = 0.02f;
if (model.getOrientation() == Orientation.VERTICAL)
{
final int nbBars = 21;
for (int i = 1; i <= nbBars; i++)
{
if (((i * 100) / nbBars) <= percent)
{
canvas.drawRect((i * (barWidth + barSpacing)) + 0.03f, 0.05f, (i * (barWidth + barSpacing)) + barWidth + 0.03f, 0.85f, barPaint);
}
}
}
else
{
final int nbBars = 19;
for (int i = 1; i <= nbBars; i++)
{
if (((i * 100) / nbBars) <= percent)
{
canvas.drawRect(0.05f, 0.9f - (i * (barWidth + barSpacing)), 0.9f, (0.9f - (i * (barWidth + barSpacing))) + barWidth, barPaint);
}
}
}
}
/**
*
* @return
*/
private int getBarColour(final double value)
{
int c = Color.GRAY;
if (model.isDisabled())
{
return c;
}
if ((value > model.getLowW()) && (value < model.getHiW()))
{
return Color.WHITE;
}
else if ((value <= model.getLowW()) || (value >= model.getHiW()))
{
c = Color.YELLOW;
}
if ((value <= model.getLowD()) || (value >= model.getHiD()))
{
c = Color.RED;
}
return c;
}
@Override
public DisplayType getType()
{
return DisplayType.BAR;
}
}