/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2003-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.map.event; import java.util.EnumSet; import java.util.EventObject; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.map.MapContext; import org.geotools.map.MapViewport; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * Event object for MapContext area of interest and coordinate system changes. * * @author wolf * * @source $URL$ * http://svn.osgeo.org/geotools/trunk/modules/library/render/src/main/java/org/geotools * /map/event/MapBoundsEvent.java $ */ public class MapBoundsEvent extends EventObject { private static final long serialVersionUID = -2063712912599101999L; /** Area of interest changed, mask used by {@link Type#BOUNDS} */ public static final int AREA_OF_INTEREST_MASK = 1; /** Coordinate system changed, mask used by {@link Type#CRS} */ public static final int COORDINATE_SYSTEM_MASK = 2; /** Used to check that the type flag is acceptable */ private static final int NEXT_FLAG = 4; /** Type of map bounds event */ public enum Type { BOUNDS(AREA_OF_INTEREST_MASK), CRS(COORDINATE_SYSTEM_MASK); final private int MASK; private Type(int mask) { this.MASK = mask; } /** * Return the traditional mask value one of: {@link MapBoundsEvent#AREA_OF_INTEREST_MASK} or * {@link MapBoundsEvent#COORDINATE_SYSTEM_MASK} */ public int getMask() { return MASK; } } /** Holds value of property type. */ private EnumSet<Type> type; private ReferencedEnvelope oldAreaOfInterest; private ReferencedEnvelope newAreaOfInterest; /** * Creates a new instance of BoundsEvent * * @param source * the map context reporting the change * * @param type * the type of change indicated by one or both of the bit masks * {@linkplain #AREA_OF_INTEREST_MASK} and {@linkplain #COORDINATE_SYSTEM_MASK} * * @param oldAreaOfInterest * the context's previous area of interest * * @param newAreaOfInterest * the context's new area of interest * * @throws IllegalArgumentException * if type is invalid */ public MapBoundsEvent(MapContext source, int type, ReferencedEnvelope oldAreaOfInterest, ReferencedEnvelope newAreaOfInterest) { super(source); this.type = EnumSet.noneOf(Type.class); if ((type & AREA_OF_INTEREST_MASK) != 0) { this.type.add(Type.BOUNDS); } else if ((type & COORDINATE_SYSTEM_MASK) != 0) { this.type.add(Type.CRS); } else { throw new IllegalArgumentException("Type is not acceptable, maximum value is " + (NEXT_FLAG - 1) + ", passed value is " + type); } this.oldAreaOfInterest = oldAreaOfInterest; this.newAreaOfInterest = newAreaOfInterest; } /** * Creates a new instance of BoundsEvent. * <p> * Example: * * <pre> * new MapBoundsEvent(map, EnumSet.of(Type.BOUNDS), null, bounds) * </pre> * * @param source * map viewport reporting the change * * @param type * Type of event indicating {@link Type#BOUNDS} or {@link Type#CRS} * * @param oldAreaOfInterest * the context's previous area of interest * * @param newAreaOfInterest * the context's new area of interest * * @throws IllegalArgumentException * if type is invalid */ public MapBoundsEvent(MapViewport source, Type type, ReferencedEnvelope oldBounds, ReferencedEnvelope newBounds) { this(source, EnumSet.of(type), oldBounds, newBounds); } /** * Creates a new instance of BoundsEvent. * <p> * Example: * * <pre> * new MapBoundsEvent(map, EnumSet.of(Type.BOUNDS), null, bounds) * </pre> * * @param source * map viewport reporting the change * * @param type * EnumSet flagging one or both of the following {@linkplain #AREA_OF_INTEREST_MASK} * and {@linkplain #COORDINATE_SYSTEM_MASK} * * @param oldAreaOfInterest * the context's previous area of interest * * @param newAreaOfInterest * the context's new area of interest * * @throws IllegalArgumentException * if type is invalid */ public MapBoundsEvent(MapViewport source, EnumSet<Type> type, ReferencedEnvelope oldBounds, ReferencedEnvelope newBounds) { super(source); this.type = type; this.oldAreaOfInterest = oldBounds; this.newAreaOfInterest = newBounds; } /** * Getter for property type. The type is a bitwise or of the masks defined above. * * @return Value of property type. */ public int getType() { int field = 0; for (Type t : type) { field |= t.getMask(); } return field; } /** * Set of event types raised for this event. * * @return */ public EnumSet<Type> getEventType() { return type; } /** * Get the previous coordinate reference system. This is a convenience method equivalent to * {@linkplain #getOldAreaOfInterest()}.getCoordinateReferenceSystem() * * @return the previous CoordinateReferenceSystem object */ public CoordinateReferenceSystem getOldCoordinateReferenceSystem() { return oldAreaOfInterest.getCoordinateReferenceSystem(); } /** * Get the new coordinate reference system. This is a convenience method equivalent to * {@linkplain #getNewAreaOfInterest()}.getCoordinateReferenceSystem() * * @return the new CoordinateReferenceSystem object */ public CoordinateReferenceSystem getNewCoordinateReferenceSystem() { return newAreaOfInterest.getCoordinateReferenceSystem(); } /** * Get the old area of interest */ public ReferencedEnvelope getOldAreaOfInterest() { return this.oldAreaOfInterest; } /** * Get the new area of interest */ public ReferencedEnvelope getNewAreaOfInterest() { return this.newAreaOfInterest; } }