package tim.prune.gui.colour; import java.awt.Color; /** * Abstract class to do the discrete colouring of points, * using start and end colours and a wrapping index */ public abstract class DiscretePointColourer extends PointColourer { /** array of discrete colours to use */ private Color[] _discreteColours = null; /** array of colour indexes */ private int[] _colourIndexes = null; /** * Constructor * @param inStartColour start colour of scale * @param inEndColour end colour of scale * @param inMaxColours number of unique colours before wrap */ public DiscretePointColourer(Color inStartColour, Color inEndColour, int inMaxColours) { super(inStartColour, inEndColour, inMaxColours); } /** max number of colours is required here */ public static boolean isMaxColoursRequired() { return true; } /** * Initialise the array to the right size * @param inNumPoints number of points in the track */ protected void init(int inNumPoints) { if (_colourIndexes == null || _colourIndexes.length != inNumPoints) { // Array needs to be created or resized if (inNumPoints > 0) { _colourIndexes = new int[inNumPoints]; } else { _colourIndexes = null; } } } /** * Set the colour at the given index * @param inPointIndex point index * @param inColourIndex index of colour to use */ protected void setColour(int inPointIndex, int inColourIndex) { if (_colourIndexes != null && _colourIndexes.length > inPointIndex && inPointIndex >= 0) { _colourIndexes[inPointIndex] = inColourIndex; } } /** * Get the colour for the given point index * @param inPointIndex index of point in track * @return colour object */ public Color getColour(int inPointIndex) { if (_colourIndexes != null && _colourIndexes.length > inPointIndex && inPointIndex >= 0 && getMaxColours() > 0) { int colourIndex = _colourIndexes[inPointIndex] % getMaxColours(); if (colourIndex >= 0 && _discreteColours != null && colourIndex < _discreteColours.length) { return _discreteColours[colourIndex]; } } // not found, use default return super.getDefaultColour(); } /** * Generate the set of discrete colours to use * @param inNumCategories number of different categories found in the data */ protected void generateDiscreteColours(int inNumCategories) { int maxColours = getMaxColours(); if (maxColours <= 1) {maxColours = 2;} if (inNumCategories < 1) {inNumCategories = 1;} else if (inNumCategories > maxColours) {inNumCategories = maxColours;} // Use this number of categories to generate the colours _discreteColours = new Color[inNumCategories]; for (int i=0; i