package com.github.mikephil.charting.data;
/**
* Entry class for the BarChart. (especially stacked bars)
*
* @author Philipp Jahoda
*/
public class BarEntry extends Entry {
/** the values the stacked barchart holds */
private float[] mVals;
/** the sum of all negative values this entry (if stacked) contains */
private float mNegativeSum;
/** the sum of all positive values this entry (if stacked) contains */
private float mPositiveSum;
/**
* Constructor for stacked bar entries.
*
* @param vals
* - the stack values, use at lest 2
* @param xIndex
*/
public BarEntry(float[] vals, int xIndex) {
super(calcSum(vals), xIndex);
this.mVals = vals;
calcPosNegSum();
}
/**
* Constructor for normal bars (not stacked).
*
* @param val
* @param xIndex
*/
public BarEntry(float val, int xIndex) {
super(val, xIndex);
}
/**
* Constructor for stacked bar entries.
*
* @param vals
* - the stack values, use at least 2
* @param xIndex
* @param label
* Additional description label.
*/
public BarEntry(float[] vals, int xIndex, String label) {
super(calcSum(vals), xIndex, label);
this.mVals = vals;
calcPosNegSum();
}
/**
* Constructor for normal bars (not stacked).
*
* @param val
* @param xIndex
* @param data
* Spot for additional data this Entry represents.
*/
public BarEntry(float val, int xIndex, Object data) {
super(val, xIndex, data);
}
/**
* Returns an exact copy of the BarEntry.
*/
public BarEntry copy() {
BarEntry copied = new BarEntry(getVal(), getXIndex(), getData());
copied.setVals(mVals);
return copied;
}
/**
* Returns the stacked values this BarEntry represents, or null, if only a single value is represented (then, use
* getVal()).
*
* @return
*/
public float[] getVals() {
return mVals;
}
/**
* Set the array of values this BarEntry should represent.
*
* @param vals
*/
public void setVals(float[] vals) {
setVal(calcSum(vals));
mVals = vals;
calcPosNegSum();
}
/**
* Returns the value of this BarEntry. If the entry is stacked, it returns the positive sum of all values.
*
* @return
*/
@Override
public float getVal() {
return super.getVal();
}
/**
* Returns true if this BarEntry is stacked (has a values array), false if not.
*
* @return
*/
public boolean isStacked() {
return mVals != null;
}
public float getBelowSum(int stackIndex) {
if (mVals == null)
return 0;
float remainder = 0f;
int index = mVals.length - 1;
while (index > stackIndex && index >= 0) {
remainder += mVals[index];
index--;
}
return remainder;
}
/**
* Reuturns the sum of all positive values this entry (if stacked) contains.
*
* @return
*/
public float getPositiveSum() {
return mPositiveSum;
}
/**
* Returns the sum of all negative values this entry (if stacked) contains. (this is a positive number)
*
* @return
*/
public float getNegativeSum() {
return mNegativeSum;
}
private void calcPosNegSum() {
if (mVals == null) {
mNegativeSum = 0;
mPositiveSum = 0;
return;
}
float sumNeg = 0f;
float sumPos = 0f;
for (float f : mVals) {
if (f <= 0f)
sumNeg += Math.abs(f);
else
sumPos += f;
}
mNegativeSum = sumNeg;
mPositiveSum = sumPos;
}
/**
* Calculates the sum across all values of the given stack.
*
* @param vals
* @return
*/
private static float calcSum(float[] vals) {
if (vals == null)
return 0f;
float sum = 0f;
for (float f : vals)
sum += f;
return sum;
}
}