package tim.prune.gui.colour;
import java.awt.Color;
import tim.prune.config.ColourUtils;
/**
* Factory for the creation of PointColourer objects
*/
public abstract class ColourerFactory
{
/** Enumeration of colourer types */
public enum ColourerId
{
NONE,
BY_FILE,
BY_SEGMENT,
BY_ALTITUDE,
BY_SPEED,
BY_VSPEED,
BY_GRADIENT,
BY_DATE
}
/**
* Does the specified colourer need a field for maximum number of colours?
* @param inId id of colourer
* @return true if max colours required, false otherwise
*/
public static boolean isMaxColoursRequired(ColourerId inId)
{
switch (inId)
{
case NONE: return false;
case BY_FILE: return FileColourer.isMaxColoursRequired();
case BY_SEGMENT: return SegmentColourer.isMaxColoursRequired();
case BY_ALTITUDE: return AltitudeColourer.isMaxColoursRequired();
case BY_SPEED: return SpeedColourer.isMaxColoursRequired();
case BY_VSPEED: return VertSpeedColourer.isMaxColoursRequired();
case BY_GRADIENT: return GradientColourer.isMaxColoursRequired();
case BY_DATE: return DateColourer.isMaxColoursRequired();
}
return false;
}
/**
* Does the specified colourer need fields for start and end colours?
* @param inId id of colourer
* @return true if colours required, false otherwise
*/
public static boolean areColoursRequired(ColourerId inId)
{
// all of them except NONE need start and end colours
return inId != ColourerId.NONE;
}
/**
* @param inDesc Single character used as a code (in Config string)
* @return associated ColourerId
*/
private static ColourerId getColourerId(char inDesc)
{
switch (inDesc)
{
case 'f': return ColourerId.BY_FILE;
case 's': return ColourerId.BY_SEGMENT;
case 'a': return ColourerId.BY_ALTITUDE;
case 'p': return ColourerId.BY_SPEED;
case 'v': return ColourerId.BY_VSPEED;
case 'g': return ColourerId.BY_GRADIENT;
case 'd': return ColourerId.BY_DATE;
}
return ColourerId.NONE;
}
/**
* Create a new PointColourer object given the parameters
* @param inId id of colourer to create
* @param inStartColour start colour
* @param inEndColour end colour
* @param inMaxColours maximum number of colours
* @return PointColourer object, or null
*/
public static PointColourer createColourer(ColourerId inId, Color inStartColour, Color inEndColour, String inMaxColours)
{
try
{
switch (inId)
{
case NONE: return null;
case BY_FILE: return new FileColourer(inStartColour, inEndColour, Integer.parseInt(inMaxColours));
case BY_SEGMENT: return new SegmentColourer(inStartColour, inEndColour, Integer.parseInt(inMaxColours));
case BY_ALTITUDE: return new AltitudeColourer(inStartColour, inEndColour);
case BY_SPEED: return new SpeedColourer(inStartColour, inEndColour);
case BY_VSPEED: return new VertSpeedColourer(inStartColour, inEndColour);
case BY_GRADIENT: return new GradientColourer(inStartColour, inEndColour);
case BY_DATE: return new DateColourer(inStartColour, inEndColour, Integer.parseInt(inMaxColours));
}
}
catch (NumberFormatException nfe) {} // drop out to return null
return null;
}
/**
* Create a PointColourer object from the given description
* @param inString string from config
* @return PointColourer object, or null if string was invalid
*/
public static PointColourer createColourer(String inString)
{
try
{
String[] comps = inString.split(";");
if (comps.length == 4)
{
ColourerId colourerType = getColourerId(comps[0].charAt(0));
Color startColour = ColourUtils.colourFromHex(comps[1]);
Color endColour = ColourUtils.colourFromHex(comps[2]);
String maxColours = comps[3];
return createColourer(colourerType, startColour, endColour, maxColours);
}
}
catch (NullPointerException npe) {}
catch (NumberFormatException nfe) {}
return null;
}
/**
* Convert the given PointColourer object into a string for the config
* @param inColourer PointColourer object
* @return string describing object (for later re-creation) or null
*/
public static String PointColourerToString(PointColourer inColourer)
{
if (inColourer != null)
{
final String startColour = ColourUtils.makeHexCode(inColourer.getStartColour());
final String endColour = ColourUtils.makeHexCode(inColourer.getEndColour());
final int maxColours = inColourer.getMaxColours();
if (inColourer instanceof FileColourer) {
return "f;" + startColour + ";" + endColour + ";" + maxColours;
}
else if (inColourer instanceof SegmentColourer) {
return "s;" + startColour + ";" + endColour + ";" + maxColours;
}
else if (inColourer instanceof AltitudeColourer) {
return "a;" + startColour + ";" + endColour + ";0";
}
else if (inColourer instanceof SpeedColourer) {
return "p;" + startColour + ";" + endColour + ";0";
}
else if (inColourer instanceof VertSpeedColourer) {
return "v;" + startColour + ";" + endColour + ";0";
}
else if (inColourer instanceof GradientColourer) {
return "g;" + startColour + ";" + endColour + ";0";
}
else if (inColourer instanceof DateColourer) {
return "d;" + startColour + ";" + endColour + ";" + maxColours;
}
}
return null;
}
/**
* Get the colourer-specific end of the description key for translation
* @param inId id of colourer
* @return end of description key for combobox text
*/
public static String getDescriptionKey(ColourerId inId)
{
switch (inId)
{
case NONE: return "none";
case BY_FILE: return "byfile";
case BY_SEGMENT: return "bysegment";
case BY_ALTITUDE: return "byaltitude";
case BY_SPEED: return "byspeed";
case BY_VSPEED: return "byvertspeed";
case BY_GRADIENT: return "bygradient";
case BY_DATE: return "bydate";
}
return null;
}
/**
* Get the id of the given colourer, according to its class
* @param inColourer point colourer object, or null
* @return id, for example for selection in dropdown
*/
public static ColourerId getId(PointColourer inColourer)
{
if (inColourer != null)
{
if (inColourer instanceof FileColourer) {return ColourerId.BY_FILE;}
if (inColourer instanceof SegmentColourer) {return ColourerId.BY_SEGMENT;}
if (inColourer instanceof AltitudeColourer) {return ColourerId.BY_ALTITUDE;}
if (inColourer instanceof SpeedColourer) {return ColourerId.BY_SPEED;}
if (inColourer instanceof VertSpeedColourer) {return ColourerId.BY_VSPEED;}
if (inColourer instanceof GradientColourer) {return ColourerId.BY_GRADIENT;}
if (inColourer instanceof DateColourer) {return ColourerId.BY_DATE;}
}
return ColourerId.NONE;
}
}