]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/gui/colour/ColourerFactory.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / gui / colour / ColourerFactory.java
diff --git a/src/tim/prune/gui/colour/ColourerFactory.java b/src/tim/prune/gui/colour/ColourerFactory.java
new file mode 100644 (file)
index 0000000..767456e
--- /dev/null
@@ -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;
+       }
+}