X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fgui%2Fcolour%2FColourerFactory.java;fp=src%2Ftim%2Fprune%2Fgui%2Fcolour%2FColourerFactory.java;h=767456eead95c533c1bf772cb9811ae3b57256a1;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/gui/colour/ColourerFactory.java b/src/tim/prune/gui/colour/ColourerFactory.java new file mode 100644 index 0000000..767456e --- /dev/null +++ b/src/tim/prune/gui/colour/ColourerFactory.java @@ -0,0 +1,205 @@ +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; + } +}