ingo@535: package de.intevation.flys.client.shared; ingo@535: ingo@535: import java.io.Serializable; ingo@1598: import java.util.Date; ingo@535: ingo@610: import com.google.gwt.core.client.GWT; ingo@1598: import com.google.gwt.i18n.client.DateTimeFormat; ingo@1598: import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; ingo@1598: import com.google.gwt.i18n.client.NumberFormat; ingo@610: ingo@535: ingo@535: /** ingo@535: * This object supports a linear transformation to transform xy coordinates into ingo@535: * an other coordinate system based on scale and translation values. ingo@535: * ingo@535: * @author Ingo Weinzierl ingo@535: */ ingo@535: public class Transform2D implements Serializable { ingo@535: ingo@1598: protected String xType; ingo@1598: protected String yType; ingo@1598: ingo@535: protected double sx; ingo@535: protected double sy; ingo@535: ingo@535: protected double tx; ingo@535: protected double ty; ingo@535: ingo@535: ingo@535: public Transform2D() { ingo@535: } ingo@535: ingo@535: ingo@535: /** ingo@535: * Creates a new transformation with scale and translation factors. ingo@535: * ingo@535: * @param sx The scale factor for the x axis. ingo@535: * @param sy The scale factor for the y axis. ingo@535: * @param tx The translation factor for the x axis. ingo@535: * @param ty The translation factor for the y axis. ingo@535: */ ingo@535: public Transform2D(double sx, double sy, double tx, double ty) { ingo@1598: this(sx, sy, tx, ty, "number", "number"); ingo@1598: } ingo@1598: ingo@1598: ingo@1598: public Transform2D( ingo@1598: double sx, double sy, ingo@1598: double tx, double ty, ingo@1598: String xType, ingo@1598: String yType ingo@1598: ) { ingo@1598: this.xType = xType; ingo@1598: this.yType = yType; ingo@1598: ingo@535: this.sx = sx; ingo@535: this.sy = sy; ingo@535: this.tx = tx; ingo@535: this.ty = ty; ingo@535: } ingo@535: ingo@535: ingo@535: /** ingo@535: * Transforms the pixel x and y into a new coordinate system based on the ingo@535: * scale and translation values specified in the constructor. ingo@535: */ ingo@535: public double[] transform(double x, double y) { ingo@535: double resX = sx * x + tx; ingo@535: double resY = sy * y + ty; ingo@535: ingo@535: return new double[] { resX, resY }; ingo@535: } ingo@610: ingo@610: ingo@1598: public String[] format(Number[] xy) { ingo@1598: String x = null; ingo@1598: String y = null; ingo@1598: ingo@1598: if (xType.equals("date")) { ingo@1598: x = formatDate(xy[0].longValue()); ingo@1598: } ingo@1598: else { ingo@1598: x = formatNumber(xy[0].doubleValue()); ingo@1598: } ingo@1598: ingo@1598: if (yType.equals("date")) { ingo@1598: y = formatDate(xy[1].longValue()); ingo@1598: } ingo@1598: else { ingo@1598: y = formatNumber(xy[1].doubleValue()); ingo@1598: } ingo@1598: ingo@1598: return new String[] { x, y }; ingo@1598: } ingo@1598: ingo@1598: ingo@1598: protected String formatDate(long time) { ingo@1598: Date date = new Date(time); ingo@1598: DateTimeFormat df = getDateTimeFormat(); ingo@1598: ingo@1598: return df.format(date); ingo@1598: } ingo@1598: ingo@1598: ingo@1598: protected String formatNumber(double number) { ingo@1598: NumberFormat nf = getNumberFormat(); ingo@1598: ingo@1598: return nf.format(number); ingo@1598: } ingo@1598: ingo@1598: ingo@1598: public DateTimeFormat getDateTimeFormat() { ingo@1598: return DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT); ingo@1598: } ingo@1598: ingo@1598: ingo@1598: public NumberFormat getNumberFormat() { ingo@1598: return NumberFormat.getDecimalFormat(); ingo@1598: } ingo@1598: ingo@1598: ingo@610: public void dumpGWT() { ingo@610: GWT.log("SX = " + sx); ingo@610: GWT.log("SY = " + sy); ingo@610: GWT.log("TX = " + tx); ingo@610: GWT.log("TY = " + ty); ingo@610: } ingo@535: } ingo@535: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :