// **********************************************************************
//
//<copyright>
//
//BBN Technologies, a Verizon Company
//10 Moulton Street
//Cambridge, MA 02138
//(617) 873-8000
//
//Copyright (C) BBNT Solutions LLC. All rights reserved.
//
//</copyright>
//**********************************************************************
//
//$Source:
///cvs/darwars/ambush/aar/src/com/bbn/ambush/mission/MissionHandler.java,v
//$
//$RCSfile: FeatureDrawingAttributes.java,v $
//$Revision: 1.5 $
//$Date: 2006/03/06 16:13:59 $
//$Author: dietrick $
//
//**********************************************************************
package com.bbn.openmap.layer.vpf;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Properties;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.bbn.openmap.omGraphics.DrawingAttributes;
import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.omGraphics.OMGraphicConstants;
import com.bbn.openmap.omGraphics.OMTextLabeler;
import com.bbn.openmap.util.PropUtils;
import com.bbn.openmap.util.propertyEditor.OptionPropertyEditor;
/**
* The FeatureDrawingAttributes class is used by the VPFFeatureGraphicWarehouse
* to control the fetching and display of feature attributes out of the feature
* attribute file, controlled by the FeatureClassInfo class.
*
* @author dietrick
*/
public class FeatureDrawingAttributes
extends DrawingAttributes {
private static final long serialVersionUID = 1L;
/**
* The main GUI panel containing the superclass GUI and attribute-fetching
* GUI.
*/
protected JPanel guiPanel;
/**
* The GUI panel containing the attribute fetching choices.
*/
protected JPanel attributePanel;
/**
* A handle to the FeatureClassInfo class containing the attribute
* information.
*/
protected FeatureClassInfo fci;
/**
* The GUI combo box for attribute choices.
*/
protected JComboBox attributeJCB;
/**
* The GUI combo box for choices on how to display the attributes.
*/
protected JComboBox displayTypeJCB;
/**
* The chosen display type, which gets set as a property in each OMGraphic
* for retrieval by the layer.
*/
protected String displayType;
/**
* The chosen attribute column index in the FCI file.
*/
protected int attributeCol;
/**
* The desired attribute column name as specified in properties.
*/
protected String attributeColName;
public static final String DisplayTypeProperty = "attributeDisplay";
public static final String AttributeProperty = "attribute";
/**
* Default creation of the FeatureDrawingAttributes.
*/
public FeatureDrawingAttributes() {
super();
}
/**
* @param props
*/
public FeatureDrawingAttributes(Properties props) {
super(props);
}
/**
* @param prefix
* @param props
*/
public FeatureDrawingAttributes(String prefix, Properties props) {
super(prefix, props);
}
public void setProperties(String prefix, Properties props) {
super.setProperties(prefix, props);
if (props == null) {
return;
}
prefix = PropUtils.getScopedPropertyPrefix(prefix);
setDisplayType(props.getProperty(prefix + DisplayTypeProperty));
attributeColName = props.getProperty(prefix + AttributeProperty, attributeColName);
}
/**
* PropertyConsumer method that retrieves the current values of settable
* properties.
*/
public Properties getProperties(Properties props) {
props = super.getProperties(props);
String prefix = PropUtils.getScopedPropertyPrefix(this);
props.put(prefix + DisplayTypeProperty, PropUtils.unnull(displayType));
props.put(prefix + AttributeProperty, PropUtils.unnull(attributeColName));
return props;
}
/**
* PropertyConsumer method that gathers information about the settable
* properties.
*/
public Properties getPropertyInfo(Properties props) {
props = super.getPropertyInfo(props);
props.put(DisplayTypeProperty, "How the property should be displayed.");
props.put(DisplayTypeProperty + LabelEditorProperty, "Attribute display type");
props.put(DisplayTypeProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.ComboBoxPropertyEditor");
props.put(DisplayTypeProperty + OptionPropertyEditor.ScopedOptionsProperty, "none tt il l");
props.put(DisplayTypeProperty + ".none", "None");
props.put(DisplayTypeProperty + ".tt", "Tooltip");
props.put(DisplayTypeProperty + ".il", "Information Line");
props.put(DisplayTypeProperty + ".l", "Label");
props.put(AttributeProperty, "The Name of the Attribute to display.");
props.put(AttributeProperty + LabelEditorProperty, "Attribute name");
return props;
}
/**
* Set the attributes chosen in the GUI on the OMGraphic.
*
* @param omg the OMGraphic to set the attribute information on.
* @param id The ID number of the map feature that the OMGraphic represents.
*/
public void setTo(OMGraphic omg, int id) {
super.setTo(omg);
// now set the attributes on the OMGraphic based on the
// GUI/property settings.
if (fci != null) {
String dt = getDisplayType();
if (dt != null) {
String tooltip = fci.getAttribute(id, getAttributeCol(), null);
// Might want to to .equals here, test for speed effect.
// if (dt.equals(OMGraphicConstants.LABEL)) {
if (dt == OMGraphicConstants.LABEL) {
OMTextLabeler omtl = new OMTextLabeler(tooltip);
super.setTo(omtl);
omg.putAttribute(dt, omtl);
} else {
omg.putAttribute(dt, tooltip);
}
}
}
}
/**
* Retrieve the column index number out of the feature class info file that
* is being used/displayed.
*
* @return column index of attribute information.
*/
protected int getAttributeCol() {
return attributeCol;
}
/**
* Set the column index number in the feature class info file that will be
* used/displayed.
*/
protected void setAttributeCol(int col) {
attributeCol = col;
}
/**
* Return the GUI controls for this feature = the basic DrawingAttributes GUI
* from the superclass, plus the other attribute display controls.
*/
public Component getGUI() {
if (guiPanel == null) {
guiPanel = new JPanel();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
guiPanel.setLayout(gridbag);
c.gridwidth = GridBagConstraints.REMAINDER;
Component sgui = super.getGUI();
gridbag.setConstraints(sgui, c);
guiPanel.add(sgui);
// Attribute GUI
attributePanel = new JPanel();
attributePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), " Attribute Control "));
GridBagLayout gridbag2 = new GridBagLayout();
GridBagConstraints c2 = new GridBagConstraints();
attributePanel.setLayout(gridbag2);
c2.gridwidth = GridBagConstraints.RELATIVE;
c2.anchor = GridBagConstraints.WEST;
JLabel label = new JLabel("Name: ");
label.setToolTipText("Choose which attribute to display for each instance of this feature type.");
gridbag2.setConstraints(label, c2);
attributePanel.add(label);
c2.gridwidth = GridBagConstraints.REMAINDER;
attributeJCB = new JComboBox();
attributeJCB.setToolTipText("Choose which attribute to display for each instance of this feature type.");
attributeJCB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JComboBox jcb = (JComboBox) ae.getSource();
FCIChoice fcic = (FCIChoice) jcb.getSelectedItem();
if (fcic != null) {
setAttributeCol(fcic.getColumn());
setAttributeColName(fcic.getAttribute());
}
}
});
gridbag2.setConstraints(attributeJCB, c2);
attributePanel.add(attributeJCB);
c2.gridwidth = GridBagConstraints.RELATIVE;
label = new JLabel("How: ");
label.setToolTipText("Choose how to display the attribute.");
gridbag2.setConstraints(label, c2);
attributePanel.add(label);
c2.gridwidth = GridBagConstraints.REMAINDER;
DisplayTypeChoice[] dtc = new DisplayTypeChoice[] {
new DisplayTypeChoice("None", null),
new DisplayTypeChoice(OMGraphicConstants.TOOLTIP, OMGraphicConstants.TOOLTIP),
new DisplayTypeChoice(OMGraphicConstants.INFOLINE, OMGraphicConstants.INFOLINE),
new DisplayTypeChoice(OMGraphicConstants.LABEL, OMGraphicConstants.LABEL)
};
displayTypeJCB = new JComboBox(dtc);
displayTypeJCB.setToolTipText("Choose how to display the attribute.");
displayTypeJCB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JComboBox jcb = (JComboBox) ae.getSource();
DisplayTypeChoice dtc = (DisplayTypeChoice) jcb.getSelectedItem();
setDisplayType(dtc.getDisplayCommand());
}
});
if (OMGraphicConstants.TOOLTIP.equalsIgnoreCase(displayType)) {
displayTypeJCB.setSelectedIndex(1);
} else if (OMGraphicConstants.INFOLINE.equalsIgnoreCase(displayType)) {
displayTypeJCB.setSelectedIndex(2);
} else if (OMGraphicConstants.LABEL.equalsIgnoreCase(displayType)) {
displayTypeJCB.setSelectedIndex(3);
}
gridbag2.setConstraints(displayTypeJCB, c2);
attributePanel.add(displayTypeJCB);
updateAttributeGUI();
// End attribute GUI
gridbag.setConstraints(attributePanel, c);
guiPanel.add(attributePanel);
}
return guiPanel;
}
/**
*
*/
protected void updateAttributeGUI() {
if (attributePanel != null && attributeJCB != null && displayTypeJCB != null) {
if (fci != null) {
attributeJCB.removeAllItems();
DcwColumnInfo[] dci = fci.getColumnInfo();
int colCount = dci.length;
// StringBuffer sb = new StringBuffer();
// Need to save current attributeColName, because
// setting a new choice on an empty combo box will set
// it to that first added attribute automatically.
String cacn = attributeColName;
for (int i = 0; i < colCount; i++) {
FCIChoice fcic = new FCIChoice(dci[i].getColumnName(), dci[i].getColumnDescription(), i);
attributeJCB.addItem(fcic);
if (dci[i].getColumnName().equalsIgnoreCase(cacn)) {
attributeJCB.setSelectedItem(fcic);
}
}
attributePanel.setVisible(true);
attributeJCB.setEnabled(true);
displayTypeJCB.setEnabled(true);
} else {
attributePanel.setVisible(false);
attributeJCB.setEnabled(false);
displayTypeJCB.setEnabled(false);
}
}
}
/**
* @return Returns the displayType.
*/
public String getDisplayType() {
return displayType;
}
/**
* @param displayType The displayType to set.
*/
public void setDisplayType(String displayType) {
this.displayType = displayType;
// Check and update for not-null, so that equality check can be used
// later
if (displayType != null) {
if (displayType.equalsIgnoreCase(OMGraphicConstants.TOOLTIP)) {
displayType = OMGraphicConstants.TOOLTIP;
} else if (displayType.equalsIgnoreCase(OMGraphicConstants.LABEL)) {
displayType = OMGraphicConstants.LABEL;
} else if (displayType.equalsIgnoreCase(OMGraphicConstants.INFOLINE)) {
displayType = OMGraphicConstants.INFOLINE;
}
}
}
/**
* @return Returns the fci.
*/
public FeatureClassInfo getFci() {
return fci;
}
/**
* @param fci The fci to set.
*/
public void setFci(FeatureClassInfo fci) {
this.fci = fci;
if (attributeColName != null) {
int col = fci.whatColumn(attributeColName);
if (col >= 0) {
setAttributeCol(col);
}
}
updateAttributeGUI();
}
/**
* @return Returns the attributeColName.
*/
public String getAttributeColName() {
return attributeColName;
}
/**
* @param attributeColName The attributeColName to set.
*/
public void setAttributeColName(String attributeColName) {
this.attributeColName = attributeColName;
}
public class DisplayTypeChoice {
protected String displayName;
protected String displayCommand;
public DisplayTypeChoice(String dn, String dc) {
displayName = dn;
displayCommand = dc;
}
public String getDisplayCommand() {
return displayCommand;
}
public String getDisplayName() {
return displayName;
}
public String toString() {
return getDisplayName();
}
}
public class FCIChoice {
protected String attribute;
protected String description;
protected int column;
public FCIChoice(String att, String desc, int col) {
attribute = att;
description = desc;
column = col;
}
public String getAttribute() {
return attribute;
}
public String getDescription() {
return description;
}
public int getColumn() {
return column;
}
public String toString() {
return getDescription() + " (" + getAttribute() + ")";
}
}
}