package uk.org.smithfamily.mslogger.widgets.renderers;
import uk.org.smithfamily.mslogger.dashboards.DashboardView;
import uk.org.smithfamily.mslogger.widgets.Indicator;
import uk.org.smithfamily.mslogger.widgets.Indicator.DisplayType;
import android.content.Context;
import android.graphics.*;
/**
*
*/
public class NumericIndicator extends Painter
{
public NumericIndicator(final DashboardView parent, final Indicator model, final Context c)
{
super(parent, model, c);
}
final float scale = getResources().getDisplayMetrics().density;
private Paint backgroundPaint;
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.setTextSize(0.08f);
titlePaint.setTextAlign(Paint.Align.CENTER);
titlePaint.setFlags(anti_alias_flag);
titlePaint.setLinearText(true);
titlePaint.setAntiAlias(true);
valuePaint = new Paint();
valuePaint.setColor(Color.WHITE);
valuePaint.setTextSize(0.2f);
valuePaint.setTextAlign(Paint.Align.CENTER);
valuePaint.setFlags(anti_alias_flag);
valuePaint.setLinearText(true);
valuePaint.setAntiAlias(true);
backgroundPaint = new Paint();
backgroundPaint.setColor(Color.BLACK);
}
/**
*
* @param canvas
*/
private void drawBackground(final Canvas canvas)
{
backgroundPaint.setColor(getBgColour());
canvas.drawRect(0.0f, 0.0f, 1.0f, 1.0f, backgroundPaint);
}
/**
*
* @param canvas
*/
private void drawTitle(final Canvas canvas)
{
titlePaint.setColor(getFgColour());
String text = model.getTitle();
if (!model.getUnits().equals(""))
{
text += " (" + model.getUnits() + ")";
}
canvas.drawText(text, 0.48f, 0.65f, titlePaint);
}
/**
*
* @param canvas
*/
private 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.5f, 0.5f, valuePaint);
}
@Override
protected int getFgColour()
{
if (model.isDisabled())
{
return Color.DKGRAY;
}
if ((model.getValue() > model.getLowW()) && (model.getValue() < model.getHiW()))
{
return Color.WHITE;
}
else
{
return Color.BLACK;
}
}
/**
*
* @return
*/
private int getBgColour()
{
int c = Color.GRAY;
final double value = model.getValue();
if ((value > model.getLowW()) && (value < model.getHiW()))
{
c = Color.BLACK;
}
else if ((value <= model.getLowW()) || (value >= model.getHiW()))
{
c = Color.YELLOW;
}
if ((value <= model.getLowD()) || (value >= model.getHiD()))
{
c = Color.RED;
}
if (model.isDisabled())
{
c = Color.GRAY;
}
return c;
}
/**
* @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;
}
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.translate(left, top);
canvas.scale(width, height);
drawBackground(canvas);
if (model.isDisabled())
{
model.setValue(model.getMin());
}
else
{
drawValue(canvas);
}
drawTitle(canvas);
canvas.restore();
}
@Override
public DisplayType getType()
{
return DisplayType.NUMERIC;
}
@Override
public boolean isIsotropic()
{
return false;
}
}