// **********************************************************************
//
// <copyright>
//
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/vpf/VPFFeatureGraphicWarehouse.java,v $
// $RCSfile: VPFFeatureGraphicWarehouse.java,v $
// $Revision: 1.9 $
// $Date: 2009/01/21 01:24:41 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.layer.vpf;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Properties;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import com.bbn.openmap.io.FormatException;
import com.bbn.openmap.omGraphics.DrawingAttributes;
import com.bbn.openmap.omGraphics.OMColor;
import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.omGraphics.OMPoint;
import com.bbn.openmap.omGraphics.OMPoly;
import com.bbn.openmap.omGraphics.OMText;
import com.bbn.openmap.proj.coords.LatLonPoint;
import com.bbn.openmap.util.Debug;
import com.bbn.openmap.util.PropUtils;
/**
* Implement a graphic factory that builds OMGraphics. It's different in that it
* expects that the feature type has already been checked at the CoverageTable
* level, and should just build whatever graphic is sent to it. Called from
* within CoverageTable.drawFeatures().
*
* @see com.bbn.openmap.omGraphics.OMGraphic
*/
public class VPFFeatureGraphicWarehouse extends VPFLayerGraphicWarehouse implements
VPFFeatureWarehouse {
public final static String DEFAULT = "DEFAULT";
protected Hashtable<String, DrawingAttributes> featureDrawingAttributes;
/**
*
*/
public VPFFeatureGraphicWarehouse() {
super();
}
/**
* Called from super class constructor.
*
*/
protected void initDrawingAttributes() {
drawingAttributes = new FeatureDrawingAttributes();
}
/**
* Set properties of the warehouse.
*
* @param prefix the prefix to use for looking up properties.
* @param props the properties file to look at.
*/
public void setProperties(String prefix, Properties props) {
super.setProperties(prefix, props);
createFeatureDrawingAttributes(prefix, props, getFeatures());
}
/**
* From the initial properties, create the hashtable that holds the
* DrawingAttributes object for each feature type. The feature name is the
* key to the drawing attributes for that feature (roadl).
*
* @param prefix the prefix used for the properties
* @param props the properties object
* @param features a List of Strings, each representing a feature type that
* when appended to the prefix, will serve as a prefix for the
* drawing attributes settings for that feature. With a layer prefix
* of vmapRoads, and a feature type of roadl, the line color
* attribute property looked for will be vmapRoads.roadl.lineColor.
*/
public void createFeatureDrawingAttributes(String prefix, Properties props,
List<String> features) {
String realPrefix = PropUtils.getScopedPropertyPrefix(prefix);
featureDrawingAttributes = new Hashtable<String, DrawingAttributes>();
if (drawingAttributes != null) {
featureDrawingAttributes.put(DEFAULT, drawingAttributes);
} else {
drawingAttributes = new FeatureDrawingAttributes();
}
for (String feature : features) {
FeatureDrawingAttributes da = (FeatureDrawingAttributes) drawingAttributes.clone();
da.setStroke(drawingAttributes.cloneBasicStroke());
da.setProperties(realPrefix + feature, props);
featureDrawingAttributes.put(feature, da);
}
}
/**
* Don't do this lightly, or everything will be colored the default value.
* The keys to the Hashtable should be the feature type names, and the
* values should be the DrawingAttributes for that feature.
*/
public void setFeatureDrawingAttributes(Hashtable<String, DrawingAttributes> attributes) {
featureDrawingAttributes = attributes;
}
/**
* Get the Hashtable used for the feature DrawingAttributes lookup.
*/
public Hashtable<String, DrawingAttributes> getFeatureDrawingAttributes() {
return featureDrawingAttributes;
}
/**
* Return the GUI for certain warehouse attributes. By default, return the
* GUI for the DrawingAttributes object being used for rendering attributes
* of the graphics.
*
* @param lst LibrarySelectionTable to use to get information about the
* data, if needed.
*/
public Component getGUI(LibrarySelectionTable lst) {
JTabbedPane jtp = new JTabbedPane();
jtp.addTab(DEFAULT, null, drawingAttributes.getGUI(), "General Attributes");
for (String currentFeature : getFeatures()) {
DrawingAttributes da = getAttributesForFeature(currentFeature);
if (da != null) {
String desc = null;
try {
desc = lst.getDescription(currentFeature);
} catch (FormatException fe) {
}
if (desc == null) {
desc = "Feature Description Unavailable";
}
JPanel featurePanel = new JPanel();
featurePanel.add(da.getGUI());
jtp.addTab(currentFeature, null, featurePanel, desc);
}
}
return jtp;
}
/**
* Given a feature type, get the DrawingAttributes for that feature. Should
* be very unlikely to get a null value back.
*/
public FeatureDrawingAttributes getAttributesForFeature(String featureType) {
if (featureType != null) {
FeatureDrawingAttributes ret;
if (featureDrawingAttributes != null) {
ret = (FeatureDrawingAttributes) featureDrawingAttributes.get(featureType);
if (ret == null) {
ret = (FeatureDrawingAttributes) drawingAttributes;
}
} else {
ret = (FeatureDrawingAttributes) drawingAttributes;
}
return ret;
} else {
return (FeatureDrawingAttributes) drawingAttributes;
}
}
/**
*
*/
public OMGraphic createArea(CoverageTable covtable, AreaTable areatable, List<Object> facevec,
LatLonPoint ll1, LatLonPoint ll2, double dpplat, double dpplon,
String featureType, int primID) {
List<CoordFloatString> ipts = new ArrayList<CoordFloatString>();
int totalSize = 0;
try {
totalSize = areatable.computeEdgePoints(facevec, ipts);
} catch (FormatException f) {
Debug.output("FormatException in computeEdgePoints: " + f);
return null;
}
if (totalSize == 0) {
return null;
}
OMPoly py = createAreaOMPoly(ipts, totalSize, ll1, ll2, dpplat, dpplon, covtable.doAntarcticaWorkaround);
// getAttributesForFeature(featureType).setTo(py);
//int id = ((Integer) facevec.get(0)).intValue();
setAttributesForFeature(py, covtable, featureType, primID);
// HACK to get tile boundaries to not show up for areas.
// py.setLinePaint(py.getFillPaint());
// py.setSelectPaint(py.getFillPaint());
py.setLinePaint(OMColor.clear);
py.setSelectPaint(OMColor.clear);
addArea(py);
return py;
}
protected String info = null;
/**
*
*/
public OMGraphic createEdge(CoverageTable c, EdgeTable edgetable, List<Object> edgevec,
LatLonPoint ll1, LatLonPoint ll2, double dpplat, double dpplon,
CoordFloatString coords, String featureType, int primID) {
//int id = ((Integer) edgevec.get(0)).intValue();
OMPoly py = createEdgeOMPoly(coords, ll1, ll2, dpplat, dpplon);
setAttributesForFeature(py, c, featureType, primID);
py.setFillPaint(OMColor.clear);
py.setIsPolygon(false);
addEdge(py);
return py;
}
/**
* @param omg The OMGraphic owning the attributes.
* @param c the CoverageTable for the feature.
* @param featureType the type of Feature.
* @param id ID of the OMGraphic.
*/
protected void setAttributesForFeature(OMGraphic omg, CoverageTable c, String featureType,
int id) {
FeatureDrawingAttributes fda = getAttributesForFeature(featureType);
if (fda.getFci() == null) {
fda.setFci(c.getFeatureClassInfo(featureType));
}
fda.setTo(omg, id);
}
/**
*
*/
public OMGraphic createText(CoverageTable c, TextTable texttable, List<Object> textvec,
double latitude, double longitude, String text, String featureType,
int primID) {
OMText txt = createOMText(text, latitude, longitude);
//int id = ((Integer) textvec.get(0)).intValue();
setAttributesForFeature(txt, c, featureType, primID);
// getAttributesForFeature(featureType).setTo(txt);
addText(txt);
return txt;
}
/**
* Method called by the VPF reader code to construct a node feature.
*/
public OMGraphic createNode(CoverageTable c, NodeTable t, List<Object> nodeprim,
double latitude, double longitude, boolean isEntityNode,
String featureType, int primID) {
OMPoint pt = createOMPoint(latitude, longitude);
// int id = ((Integer) nodeprim.get(0)).intValue();
setAttributesForFeature(pt, c, featureType, primID);
// getAttributesForFeature(featureType).setTo(pt);
addPoint(pt);
return pt;
}
public boolean needToFetchTileContents(String libraryName, String currentFeature,
TileDirectory currentTile) {
return true;
}
public static void main(String argv[]) {
new VPFFeatureGraphicWarehouse();
}
}