package com.github.mikephil.charting.highlight;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.interfaces.BarDataProvider;
/**
* Created by Philipp Jahoda on 22/07/15.
*/
public class HorizontalBarHighlighter extends BarHighlighter {
public HorizontalBarHighlighter(BarDataProvider chart) {
super(chart);
}
@Override
public Highlight getHighlight(float x, float y) {
Highlight h = super.getHighlight(x, y);
if (h == null)
return h;
else {
BarDataSet set = mChart.getBarData().getDataSetByIndex(h.getDataSetIndex());
if (set.isStacked()) {
// create an array of the touch-point
float[] pts = new float[2];
pts[0] = y;
// take any transformer to determine the x-axis value
mChart.getTransformer(set.getAxisDependency()).pixelsToValue(pts);
return getStackedHighlight(h, set, h.getXIndex(), h.getDataSetIndex(), pts[0]);
} else
return h;
}
}
@Override
protected int getXIndex(float x) {
if (!mChart.getBarData().isGrouped()) {
// create an array of the touch-point
float[] pts = new float[2];
pts[1] = x;
// take any transformer to determine the x-axis value
mChart.getTransformer(YAxis.AxisDependency.LEFT).pixelsToValue(pts);
return (int) Math.round(pts[1]);
} else {
float baseNoSpace = getBase(x);
int setCount = mChart.getBarData().getDataSetCount();
int xIndex = (int) baseNoSpace / setCount;
int valCount = mChart.getData().getXValCount();
if (xIndex < 0)
xIndex = 0;
else if (xIndex >= valCount)
xIndex = valCount - 1;
return xIndex;
}
}
/**
* Returns the base y-value to the corresponding x-touch value in pixels.
*
* @param y
* @return
*/
@Override
protected float getBase(float y) {
// create an array of the touch-point
float[] pts = new float[2];
pts[1] = y;
// take any transformer to determine the x-axis value
mChart.getTransformer(YAxis.AxisDependency.LEFT).pixelsToValue(pts);
float yVal = pts[1];
int setCount = mChart.getBarData().getDataSetCount();
// calculate how often the group-space appears
int steps = (int) ((float) yVal / ((float) setCount + mChart.getBarData().getGroupSpace()));
float groupSpaceSum = mChart.getBarData().getGroupSpace() * (float) steps;
float baseNoSpace = (float) yVal - groupSpaceSum;
return baseNoSpace;
}
}