[isidorus-cvs] r541 - branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/values

lgiessmann at common-lisp.net lgiessmann at common-lisp.net
Fri Jul 1 09:37:26 UTC 2011


Author: lgiessmann
Date: Fri Jul  1 02:37:25 2011
New Revision: 541

Log:
gdl-frontend: Widgets: implemented a class that wraps a CSS Color value - instead of the GWT color value, instances of this class throw a InvalidGdlException if a color value is invalid or unsupported

Added:
   branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/values/ColorValue.java
   branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/values/NumUnitValue.java

Added: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/values/ColorValue.java
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/values/ColorValue.java	Fri Jul  1 02:37:25 2011	(r541)
@@ -0,0 +1,172 @@
+package us.isidor.gdl.anaToMia.Widgets.values;
+
+import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException;
+
+public class ColorValue {
+	private String stringValue = null;
+	
+	
+	// some constructors
+	public ColorValue(){
+		this.stringValue = "#000000";
+	}
+	
+	
+	public ColorValue(String color) throws InvalidGdlSchemaException{
+		String value = color.toLowerCase();
+		
+		if(value.matches("^(maroon|red|orange|yellow|olive|purple|fuchsia|white|lime|green|navy|blue|aqua|teal|black|silver|gray)$")){
+			this.stringValue = cssColorToRRGGBB(CssColor.valueOf(value));
+		}else if(value.matches("^#[0-9a-f]{6}$")) {
+			this.stringValue = value;
+		}else if(value.matches("^#[0-9a-f]{3}$")) {
+			this.stringValue = "#" + value.charAt(1) + value.charAt(1) + value.charAt(2) + value.charAt(2) + value.charAt(3) + value.charAt(3);
+		}else if(value.matches("^rgb\\( *\\+?[0-9]{1,3} *, *\\+?[0-9]{1,3} *, *\\+?[0-9]{1,3} *\\)$")){
+			String[] rgb = value.substring(4, value.length() - 1).split(",");
+			this.stringValue = "#" + decToHexIntegerString(rgb[0]) + decToHexIntegerString(rgb[1]) + decToHexIntegerString(rgb[2]); 
+		}else if(value.matches("^rgb\\( *\\+?[0-9]{1,3}% *, *\\+?[0-9]{1,3}% *, *\\+?[0-9]{1,3}% *\\)$")){
+			String[] rgb = value.substring(4, value.length() - 1).split(",");
+			this.stringValue = "#" + percentToHexIntegerString(rgb[0]) + percentToHexIntegerString(rgb[1]) + percentToHexIntegerString(rgb[2]); 
+		}else {
+			throw new InvalidGdlSchemaException("a ColorValue must be a value of the format #RRGGBB, #RGB, rdg(rrr,ggg,bbb), rgb(rrr%,ggg%,bbb%) or a CssColor, but is " + color);
+		}
+	}
+	
+	
+	// converts an integer string of a decimal to a hex representation
+	private String decToHexIntegerString(String decIntegerString){
+		int intValue = Integer.valueOf(decIntegerString.replaceFirst("\\+", "").trim());
+		intValue = intValue > 255 ? 255 : intValue;
+		String result = Integer.toHexString(intValue);
+		return result.length() == 1 ? "0" + result : result;
+	}
+	
+	
+	// converts an integer representing a percentage value string 
+	// to a hex representation
+	private String percentToHexIntegerString(String percentageString){
+		String rawValue = percentageString.replaceFirst("%", "").replaceFirst("\\+", "").trim();
+		int percentValue = Integer.valueOf(rawValue);
+		String result = Integer.toHexString((int)(255 * ((float)percentValue / 100)));
+		return result.length() == 1 ? "0" + result : result;
+	}
+	
+	
+	public ColorValue(int r, int g, int b) throws InvalidGdlSchemaException {
+		this("rgb(" + r + "," + g + "," + b + ")");
+	}
+	
+	
+	public ColorValue(CssColor color){
+		this.stringValue = cssColorToRRGGBB(color); 
+	}
+	
+	
+	// a helper method that parses CssColor instances
+	// to a string of the format ##RRGGBB
+	private String cssColorToRRGGBB(CssColor color){
+		switch(color){
+		case maroon: return "#800000";
+		case red: return "#ff0000";
+		case orange: return "#ffa500";
+		case yellow: return "#ffff00";
+		case olive: return "#808000";
+		case purple: return "#800080";
+		case fuchsia: return "#ff00ff";
+		case white: return "#ffffff";
+		case lime: return "#00ff00";
+		case green: return "#008000";
+		case navy: return "#000080";
+		case blue: return "#0000ff";
+		case aqua: return "#00ffff";
+		case teal: return "#008080";
+		case black: return "#000000";
+		case silver: return "#c0c0c0";
+		default: return "#808080";
+		}
+	}
+	
+	
+	// returns a string of the format #RRGGBB
+	public String getStringValue(){
+		return this.stringValue;
+	}
+	
+	
+	// returns an int array of the form [r, g, b] of the stored
+	// color value
+	public int[] getRGBvalue(){
+		String r = "" + this.stringValue.charAt(1) + this.stringValue.charAt(2);
+		String g = "" + this.stringValue.charAt(3) + this.stringValue.charAt(4);
+		String b = "" + this.stringValue.charAt(5) + this.stringValue.charAt(6);
+		
+		return new int[]{Integer.valueOf(r, 16), Integer.valueOf(g, 16), Integer.valueOf(b, 16)};
+	}
+	
+	
+	// returns a CSSColor instance of the stored value, if it is
+	// a value that corresponds to the defined keywords, otherwise
+	// the return value is null
+	public CssColor getCssColor(){
+		if(this.stringValue.equals("#800000")){
+			return CssColor.maroon;
+		}else if(this.stringValue.equals("#ff0000")){
+			return CssColor.red;
+		}else if(this.stringValue.equals("#ffa500")) {
+			return CssColor.orange;
+		}else if(this.stringValue.equals("#ffff00")){
+			return CssColor.yellow;
+		}else if(this.stringValue.equals("#808000")) {
+			return CssColor.olive;
+		}else if(this.stringValue.equals("#800080")){
+			return CssColor.purple;
+		}else if(this.stringValue.equals("#ff00ff")) {
+			return CssColor.fuchsia;
+		}else if(this.stringValue.equals("#ffffff")){
+			return CssColor.white;
+		}else if(this.stringValue.equals("#00ff00")) {
+			return CssColor.lime;
+		}else if(this.stringValue.equals("#008000")) {
+			return CssColor.green;
+		}else if(this.stringValue.equals("#000080")) {
+			return CssColor.navy;
+		}else if(this.stringValue.equals("#0000ff")) {
+			return CssColor.blue;
+		}else if(this.stringValue.equals("#00ffff")) {
+			return CssColor.aqua;
+		}else if(this.stringValue.equals("#008080")) {
+			return CssColor.teal;
+		}else if(this.stringValue.equals("#000000")) {
+			return CssColor.black;
+		}else if(this.stringValue.equals("#c0c0c0")) {
+			return CssColor.silver;
+		}else if(this.stringValue.equals("#808080")) {
+			return CssColor.gray;
+		}else {
+			return null;
+		}
+	}
+	
+	
+	// represents the color key words that are defined in CSS chapter 4.3.6
+	// (http://www.w3.org/TR/CSS21/syndata.html#value-def-color)
+	public enum CssColor{
+		maroon,
+		red,
+		orange,
+		yellow,
+		olive,
+		purple,
+		fuchsia,
+		white,
+		lime,
+		green,
+		navy,
+		blue,
+		aqua,
+		teal,
+		black,
+		silver,
+		gray
+	}
+}

Added: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/values/NumUnitValue.java
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/values/NumUnitValue.java	Fri Jul  1 02:37:25 2011	(r541)
@@ -0,0 +1,79 @@
+package us.isidor.gdl.anaToMia.Widgets.values;
+
+import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException;
+
+public class NumUnitValue {
+	private CssUnit unit = CssUnit.pixel;
+	private float value = 0f;
+	
+	
+	// some constructors
+	public NumUnitValue(){}
+	
+	
+	public NumUnitValue(String numUnit) throws InvalidGdlSchemaException {
+		if(numUnit.endsWith("px")){
+			this.value = makeFloat(numUnit, 2);
+			this.unit = CssUnit.pixel;
+		}else if (numUnit.endsWith("pt")){
+			this.value = makeFloat(numUnit, 2);
+			this.unit = CssUnit.point;
+		} else if(numUnit.endsWith("%")){
+			this.value = makeFloat(numUnit, 1);
+			this.unit = CssUnit.percentage;
+		} else {
+			throw new InvalidGdlSchemaException("numeric values supported by the GDL containing a unit definition must be of the form <numeric-value>(pt|px|%), but found: " + numUnit);
+		}
+	}
+	
+	
+	// a helper method that returns a float parsed of the passed stringToParse,
+	// whereas the tailing endToIgnore characters are ignored
+	private float makeFloat(String stringToParse, int endToIgnore) throws InvalidGdlSchemaException {
+		if(stringToParse == null || stringToParse.length() <= endToIgnore){
+			throw new InvalidGdlSchemaException("numeric values supported by the GDL containing a unit definition must be of the form <numeric-value>(pt|px|%), but found: " + stringToParse);
+		}
+		
+		String str = stringToParse.substring(0, stringToParse.length() - endToIgnore);
+		
+		try{
+			return Float.valueOf(str);
+		}catch(NumberFormatException e){
+			throw new InvalidGdlSchemaException("numeric values supported by the GDL containing a unit definition must be of the form <numeric-value>(pt|px|%), but found: " + stringToParse);
+		}
+	}
+	
+	
+	// returns the value represented by this instance as a css string
+	public String getStringValue(){
+		switch(this.unit){
+		case pixel: return (int)this.value + "px";
+		case point: return (int)this.value + "pt";
+		default: return this.value + "%";
+		}
+	}
+	
+	
+	// returns the numeric value as a float
+	public float getNumValue(){
+		if(this.unit == CssUnit.percentage){
+			return this.value;
+		} else {
+			return (int)this.value;
+		}
+	}
+	
+	
+	// returns the CssUnit that is represented by this instance
+	public CssUnit getUnit(){
+		return this.unit;
+	}
+	
+	
+	// a subset of CSS units that are supported by the GDL
+	public enum CssUnit {
+		point,
+		pixel,
+		percentage
+	}
+}




More information about the Isidorus-cvs mailing list