blob: bb9cb9132595ced8ddca2ece9117d19689a2fe69 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 EfficiOS Inc., Jonathan Rajotte-Julien
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.chart.ui.data;
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
import java.math.BigDecimal;
/**
* BigDecimal based range representation. The chart range cannot be 0.
*
* TODO: See if this chart range is specific to the swtchart charts that are
* implemented in this plugin or if they can be re-used in another other
* charting scheme. We'll probably know when we actually have another
* implementation. If swtchart specific, the name of the class and package
* should make it clear.
*
* @author Jonathan Rajotte-Julien
*/
public class ChartRange {
// ------------------------------------------------------------------------
// Members
// ------------------------------------------------------------------------
private BigDecimal fMinimum;
private BigDecimal fMaximum;
private BigDecimal fRange;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Constructor.
*/
public ChartRange() {
fMinimum = BigDecimal.ZERO;
fMaximum = BigDecimal.ONE;
fRange = checkNotNull(getMaximum().subtract(getMinimum()));
}
/**
* Constructor with minimum and maximum values supplied.
*
* @param minimum
* The minimum value of the range
* @param maximum
* The maximum value of the range
*/
public ChartRange(BigDecimal minimum, BigDecimal maximum) {
BigDecimal subtract = maximum.subtract(minimum);
if (minimum.compareTo(maximum) > 0) {
throw new IllegalArgumentException("ChartRange: minimum should be lower than or equal to the maximum (min: " + minimum + ", max: " + maximum + ')'); //$NON-NLS-1$ //$NON-NLS-2$
}
if (BigDecimal.ZERO.equals(subtract)) {
/*
* Minimum and maximum values are all the same, so add 1 to the
* minimum
*/
fMinimum = minimum;
fMaximum = minimum.add(BigDecimal.ONE);
fRange = BigDecimal.ONE;
} else {
fMinimum = minimum;
fMaximum = maximum;
fRange = checkNotNull(subtract);
}
}
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
/**
* Accessor that returns the lower bound of the range.
*
* @return The minimum value of the range
*/
public BigDecimal getMinimum() {
return fMinimum;
}
/**
* Accessor that returns the upper bound of the range.
*
* @return The maximum value of the range
*/
public BigDecimal getMaximum() {
return fMaximum;
}
/**
* Accessor that returns the difference between the lower and the upper
* bounds of the range.
*
* @return The range delta
*/
public BigDecimal getDelta() {
return fRange;
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
/**
* This method clamps the positive minimum value of this range down to zero.
* It returns the current object back with the minimum value modified.
*
* @return The current range map
*/
public ChartRange clamp() {
if (fMinimum.compareTo(BigDecimal.ZERO) > 0) {
fMinimum = BigDecimal.ZERO;
fRange = fMaximum;
}
return this;
}
@Override
public String toString() {
return "ChartRange: [" + fMinimum + ", " + fMaximum + "]"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
}
}