package uk.ac.leeds.ccg.geotools; import java.awt.*; /** * A layer contains geographic feature of some kind that can be displayed in a map. * Anything that wants to end up on screen in a Viewer will need to * implement this.

* Understanding Layers is key to understanding how geoTools works and if * you plan to add a new type of geographic feature then the layer interface is the place to * start.

* Layers are held in one or more themes which in turn are held in one or more * viewers.

* If you do write your own type of layer then extending simpleLayer will make * life easyer for you. */ public interface Layer { public static final int LOADING = 1; public static final int PENDING = 2; public static final int ERRORED = 4; public static final int ABORTED = 8; public static final int COMPLETED = 16; /** * Paints the layer to the screen. * The very hart of the layer mechanism, paintScaled is where layers * have to do most of their work.
* Calling and filling in of this method is handled by the theme to which * the layer has been added.

* The GeoGraphics object should provide you with everything * needed to plot a feature onto the screen.
* Inside gg you can use or not use the facilies provided as you see fit.

* gg.getGraphics() A Graphics object to which you should direct all of your output. * gg.getScale() A Scaler which you can use to convert real world(tm) co-ordinates * into on screen co-ordinates for use with the Graphics g object. * gg.getShade() shade A Shader, if you want to color your features based on a value (perhaps from the data peramiter) then * use shade.getColor(double value); to obtain the colours. * gg.getGeoData() A GeoData object, use this if your features have id's then you can obtain a coresponding value * from data. * gg.getStyle() style A style with hints on how to display the features */ public void paintScaled(GeoGraphics gg); /** * Highligts the specified feature. * A simple version of paintScaled, this is used to paint a single feature * in some way that make it stand out from the other features.
* Todate, this has been by using a bright red colour, a more user-definable * system maybe implemented in later versions.
* Again the only thing that sould call this is a Theme
* @param g A Graphics object to paint the highlighted feature to. * @param scale A scaler that can be used to scale the feature. * @param id An int for the ID of the feature to be highlighted. * @param style A style with hints on how to display the highlight * @see uk.ac.leeds.ccg.geotools.Theme */ public void paintHighlight(Graphics g,Scaler scale,int id,ShadeStyle style); /** * Dispays the specified features. * A simple version of paintScaled, this is used to paint a group of features * in some way that make it stand out from the other features.
* Todate, this has been by using a bright red colour, a more user-definable * system maybe implemented in later versions.
* Again the only thing that sould call this is a Theme
* @param g A Graphics object to paint the selected features to. * @param scale A scaler that can be used to scale the feature. * @param ids An int[] for the IDs of the features to be shown as selected. * @param style A style with hints on how to display the selection * @see uk.ac.leeds.ccg.geotools.Theme */ public void paintSelection(Graphics g,Scaler scale,int ids[],ShadeStyle style); /** * Gets the smallest GeoRectangle that will contain all of this layers features. * When implementing this, set up a new GeoRectangle that will define the region of interest for your * layer.

* @return GeoRectangle A GeoRectangle that will contain all of the features in the layer; For layers without geographic bounds it should return a null e.g. a scale bar or a norh arrow. */ public GeoRectangle getBounds(); /** * Gets the smallest GeoRectangle that will contain the feature identified by the given ID. * @since 0.6.5 * @param id The id of the feature to fetch the bounds of * @return GeoRectangle The bounds of the requested feature */ public GeoRectangle getBoundsOf(int id); /** * Gets the smallest GeoRectangle that will contain the features identified by the given IDs. * @since 0.6.5 * @param id[] The ids of the features to fetch the bounding rectangle * @return GeoRectangle The bounds of the requested feature */ public GeoRectangle getBoundsOf(int id[]); /** * gets the ID of the feature that can be assosiated with a given point. * For example, the ID of a feature that contains the point. * @param p The GeoPoint of a location to test for a feature. * @return int The id of the feature assosiated with this point; return 0 if no feature is associated. */ public int getID(GeoPoint p); /** * gets the ID of the features that can be assosiated with a given region. * For example, the IDs of all features that are within the rectangle. * @param box The GeoGeoractangle of the region of the query. * * @return int[] The ids of the features assosiated with this region; returns new int[0] if no features are selected. */ public int[] getIDs(GeoRectangle box,int mode); /** * A convinence method that is the same as getID(GeoPoint) but witout having to construct a geoPoint. * @param x a double, the x co-ordinate. * @param y a double, the y co-ordinate. * @return int The id of the feature assosiated with this point; return 0 if no feature is associated. */ public int getID(double x,double y); /*{ GeoPoint p = new GeoPoint(x,y); return getID(p); }*/ /** * get the status of this layer: in most cases this should be * Layer.COMPLETED to show that the layer is ready to paint. * Where a layer has posponed loading it can be * Layer.PENDING, Layer.LOADING, Layer.ERRORED or Layer.ABORTED */ public int getStatus(); /** * set the status of this layer: in most cases this should be * Layer.COMPLETED to show that the layer is ready to paint. * Where a layer has posponed loading it can be * Layer.PENDING, Layer.LOADING, Layer.ERRORED or Layer.ABORTED
* When the status becomes COMPLETED for the first time, a * LayerChangedEvent is sent. * Should only be called by the Layer Producer or * the Layer itself */ public void setStatus(int status); /** * Adds a LayerChangedListener to the layer, typicaly called by Theme * writen for you if you extend simpleLayer(); */ public void addLayerChangedListener(LayerChangedListener lcl); /** * Removes a LayerChangedListener to the layer, typicaly called by Theme * writen for you if you extend simpleLayer(); */ public void removeLayerChangedListener(LayerChangedListener lcl); /** * Notifis all LayerChangedListener's that this layer has been modified. * It should only normaly be called by the layer itself. * To make life easyer it has been writen for you if you extend simpleLayer. * Make sure you call it if some aspect of your feature changes such that you would like it * to be re-painted.

* @param reason An int code indicating what type of change has occured; LayerChangedEvent provides GEOGRAPHY and DATA as two * constants to use as reason codes. * @see LayerChangedListener */ public void notifyLayerChangedListeners(int reason); /** Set the name of this layer so it can be viewed in toString() and * getName() later on. * @param n the name of the layer */ public void setName(String n); /** * Get the name of this layer. If it has not been set in setName(), then * the layer will be called "Unknown". */ public String getName(); /** * Get the name of this layer. If it has not been set in setName(), then * the layer will be called "Unknown". */ public String toString(); }