package com.vividsolutions.jump.workbench.ui.renderer.style; import com.vividsolutions.jts.util.Assert; import com.vividsolutions.jump.util.Blackboard; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.util.Iterator; public abstract class BasicFillPattern implements Paint, Cloneable { public static final String COLOR_KEY = "COLOR"; //Lazily initialize paint -- it may be too slow to create paint for all fill patterns //at once. [Jon Aquino] private Paint paint; private Blackboard properties; /** * Parameterless constructor for Java2XML */ public BasicFillPattern() { } public BasicFillPattern(Blackboard properties) { setProperties(properties); } public boolean equals(Object obj) { if (obj == null) { return false; } //Allow checking for equality. Otherwise, lose selected combo box value //on re-entering Change Styles dialog. [Jon Aquino] if (getClass() != obj.getClass()) { return false; } BasicFillPattern other = (BasicFillPattern) obj; if (getProperties().getProperties().size() != other.getProperties() .getProperties() .size()) { return false; } for (Iterator i = getProperties().getProperties().keySet().iterator(); i.hasNext();) { String key = (String) i.next(); if (other.getProperties().getProperties().get(key) == null) { return false; } if (!getProperties().getProperties().get(key).equals(other.getProperties() .getProperties() .get(key))) { return false; } } return true; } private Paint getPaint() { if (paint == null) { BufferedImage image = createImage(properties); paint = new TexturePaint(image, new Rectangle2D.Double(0, 0, image.getWidth(), image.getHeight())); } return paint; } public Blackboard getProperties() { return properties; } public BasicFillPattern setProperties(Blackboard properties) { this.properties = properties; paint = null; return this; } public abstract BufferedImage createImage(Blackboard properties); public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) { return getPaint().createContext(cm, deviceBounds, userBounds, xform, hints); } public int getTransparency() { return getPaint().getTransparency(); } public BasicFillPattern setColor(Color color) { setProperties(getProperties().put(COLOR_KEY, color)); return this; } public Object clone() { try { return ((BasicFillPattern)getClass().newInstance()).setProperties((Blackboard)(properties.clone())); } catch (InstantiationException e) { Assert.shouldNeverReachHere(); } catch (IllegalAccessException e) { Assert.shouldNeverReachHere(); } return null; } }