// **********************************************************************
//
// <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/gui/LayerControlButtonPanel.java,v $
// $RCSfile: LayerControlButtonPanel.java,v $
// $Revision: 1.8 $
// $Date: 2005/08/09 19:14:52 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.gui;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.URL;
import java.util.Properties;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import com.bbn.openmap.I18n;
import com.bbn.openmap.Layer;
import com.bbn.openmap.util.Debug;
import com.bbn.openmap.util.PropUtils;
import com.bbn.openmap.util.propertyEditor.OptionPropertyEditor;
import com.bbn.openmap.util.propertyEditor.OrientationPropertyEditor;
/**
* A OMComponentPanel that provides controls to manupulate layer order
* in the LayersPanel, and to provide add layer and delete layer
* buttons. This panel can be embedded into the LayersPanel, or it can
* be positioned somewhere else in the application. The LayersPanel
* can be set to create one of these itself, in which case it will be
* embedded. If you don't want an embedded version, create one and add
* it to the MapHandler, it will hook up to the LayersPanel when it
* finds it. The LayerPanes, LayersPanel and LayerControlButtonPanel
* communicate with each other using PropertyChangeEvents. The
* LayerPanes notify the LayersPanelwhen one of them is selected, and
* that event gets passed to this panel. When a button on this panel
* is pressed, it fires a PropertyChangeEvent with the layer and
* command to take to all its PropertyChangeListeners.
* <P>
*
* The LayerControlButtonPanel takes these properties:
*
* <pre>
*
*
*
*
*
*
*
* # Direction buttons are laid out, vertical or horizontal (vertical is
* default).
* orientation=vertical
* # Flag on whether to insert buttons onto LayersPanel (true by default).
* embedded=true
* # Configuration setting when embedding into LayersPanel (WEST,
* # NORTH, EAST, SOUTH, NORTH_SOUTH) NORTH_SOUTH puts up button above
* # list, down button below list.
* configuration=WEST
* # Flag to put button that lets the user delete layers (true by default).
* delete=true
* # Flag to put button that lets the user add layers, if the
* # LayersAddPanel is discovered in the MapHandler (true by default)
* add=true
*
*
*
*
*
*
*
* </pre>
*/
public class LayerControlButtonPanel extends OMComponentPanel implements
ActionListener, PropertyChangeListener {
// Images
protected static transient URL urlup;
protected static transient ImageIcon upgif;
protected static transient URL urlupc;
protected static transient ImageIcon upclickedgif;
protected static transient URL urltop;
protected static transient ImageIcon topgif;
protected static transient URL urltopc;
protected static transient ImageIcon topclickedgif;
protected static transient URL urldown;
protected static transient ImageIcon downgif;
protected static transient URL urldownc;
protected static transient ImageIcon downclickedgif;
protected static transient URL urlbottom;
protected static transient ImageIcon bottomgif;
protected static transient URL urlbottomc;
protected static transient ImageIcon bottomclickedgif;
protected static transient URL urldelete;
protected static transient ImageIcon deletegif;
protected static transient URL urldeletec;
protected static transient ImageIcon deleteclickedgif;
protected static transient URL urladd;
protected static transient ImageIcon addgif;
protected static transient URL urladdc;
protected static transient ImageIcon addclickedgif;
/**
* Static default initializations.
*/
static {
urlup = LayersPanel.class.getResource("Up.gif");
upgif = new ImageIcon(urlup, "Up");
urlupc = LayersPanel.class.getResource("Up.gif");
upclickedgif = new ImageIcon(urlupc, "Up (clicked)");
urltop = LayersPanel.class.getResource("DoubleUp.gif");
topgif = new ImageIcon(urltop, "Top");
urltopc = LayersPanel.class.getResource("DoubleUp.gif");
topclickedgif = new ImageIcon(urltopc, "Top (clicked)");
urldown = LayersPanel.class.getResource("Down.gif");
downgif = new ImageIcon(urldown, "Down");
urldownc = LayersPanel.class.getResource("Down.gif");
downclickedgif = new ImageIcon(urldownc, "Down (clicked)");
urlbottom = LayersPanel.class.getResource("DoubleDown.gif");
bottomgif = new ImageIcon(urlbottom, "Bottom");
urlbottomc = LayersPanel.class.getResource("DoubleDown.gif");
bottomclickedgif = new ImageIcon(urlbottomc, "Bottom (clicked)");
urldelete = LayersPanel.class.getResource("DeleteLayer.gif");
deletegif = new ImageIcon(urldelete, "Delete");
urldeletec = LayersPanel.class.getResource("DeleteLayer.gif");
deleteclickedgif = new ImageIcon(urldeletec, "Delete (clicked)");
urladd = LayersPanel.class.getResource("AddLayer.gif");
addgif = new ImageIcon(urladd, "Add");
urladdc = LayersPanel.class.getResource("AddLayer.gif");
addclickedgif = new ImageIcon(urladdc, "Add (clicked)");
}
protected JButton add = null;
protected JButton delete = null;
protected JButton top = null;
protected JButton up = null;
protected JButton down = null;
protected JButton bottom = null;
protected LayerAddPanel layerAddPanel;
public final static String OrientationProperty = "orientation";
public final static String ConfigurationProperty = "configuration";
public final static String EmbeddedProperty = "embedded";
public final static String DeleteLayersProperty = "delete";
public final static String AddLayersProperty = "add";
public final static String HORIZONTAL_CONFIG = OrientationPropertyEditor.HORIZONTAL;
public final static String VERTICAL_CONFIG = OrientationPropertyEditor.VERTICAL;
public final static String WEST_CONFIG = "WEST";
public final static String EAST_CONFIG = "EAST";
public final static String NORTH_CONFIG = "NORTH";
public final static String SOUTH_CONFIG = "SOUTH";
public final static String NORTH_SOUTH_CONFIG = "NORTH_SOUTH";
public final static String DefaultConfiguration = WEST_CONFIG;
protected int boxOrientation = BoxLayout.Y_AXIS; // BoxLayout.X_AXIS
protected String configuration = DefaultConfiguration;
protected boolean embedded = true;
protected boolean deleteLayers = true;
protected boolean addLayers = true;
public LayerControlButtonPanel() {
super();
createInterface();
}
public LayerControlButtonPanel(LayersPanel panel) {
this();
setLayersPanel(panel);
}
public void removeLayersPanel(LayersPanel panel) {
if (panel != null) {
panel.setControls(null);
panel.removePropertyChangeListener(this);
removePropertyChangeListener(panel);
if (embedded) {
if (configuration.equalsIgnoreCase(NORTH_SOUTH_CONFIG)) {
panel.remove(up);
panel.remove(down);
} else {
panel.remove(this);
}
}
}
}
/**
* Sets this panel to control the LayersPanel. If you want to
* extend this class and change how the buttons are displayed in
* the LayersPanel, change this method.
*/
public void setLayersPanel(LayersPanel panel) {
if (panel != null) {
// Just in case it's already been added.
panel.removePropertyChangeListener(this);
panel.addPropertyChangeListener(this);
addPropertyChangeListener(panel);
if (embedded) {
createInterface(); // again, reset for new config
// values
setLayout(new BoxLayout(this, boxOrientation));
if (panel.getLayout() instanceof BorderLayout) {
if (configuration.equalsIgnoreCase(WEST_CONFIG)) {
panel.add(this, BorderLayout.WEST);
} else if (configuration.equalsIgnoreCase(EAST_CONFIG)) {
panel.add(this, BorderLayout.EAST);
} else if (configuration.equalsIgnoreCase(NORTH_CONFIG)) {
panel.add(this, BorderLayout.NORTH);
} else if (configuration.equalsIgnoreCase(SOUTH_CONFIG)) {
panel.add(this, BorderLayout.SOUTH);
} else if (configuration.equalsIgnoreCase(NORTH_SOUTH_CONFIG)) {
panel.add(up, BorderLayout.NORTH);
panel.add(down, BorderLayout.SOUTH);
}
} else {
panel.add(this);
}
}
// Let the LayersPanel know who is controlling it.
//panel.setControls(this);
}
}
protected void createInterface() {
removeAll();
setAlignmentX(LEFT_ALIGNMENT);
setAlignmentY(CENTER_ALIGNMENT);
setLayout(new BoxLayout(this, boxOrientation));
top = new JButton(topgif);
top.setActionCommand(LayersPanel.LayerTopCmd);
top.setPressedIcon(topclickedgif);
top.setToolTipText(i18n.get(LayerControlButtonPanel.class,
"moveLayerToTop",
"Move selected layer to top"));
top.addActionListener(this);
add(top);
up = new JButton(upgif);
up.setActionCommand(LayersPanel.LayerUpCmd);
up.setPressedIcon(upclickedgif);
up.setToolTipText(i18n.get(LayerControlButtonPanel.class,
"moveLayerUpOne",
"Move selected layer up one"));
up.addActionListener(this);
add(up);
down = new JButton(downgif);
down.setPressedIcon(downclickedgif);
down.setActionCommand(LayersPanel.LayerDownCmd);
down.setToolTipText(i18n.get(LayerControlButtonPanel.class,
"moveLayerDownOne",
"Move selected layer down one"));
down.addActionListener(this);
add(down);
bottom = new JButton(bottomgif);
bottom.setPressedIcon(bottomclickedgif);
bottom.setActionCommand(LayersPanel.LayerBottomCmd);
bottom.setToolTipText(i18n.get(LayerControlButtonPanel.class,
"moveLayerToBottom",
"Move selected layer to bottom"));
bottom.addActionListener(this);
add(bottom);
if (deleteLayers) {
JLabel blank = new JLabel(" ");
add(blank);
delete = new JButton(deletegif);
delete.setActionCommand(LayersPanel.LayerRemoveCmd);
delete.setToolTipText(i18n.get(LayerControlButtonPanel.class,
"removeLayer",
"Remove selected layer"));
delete.addActionListener(this);
delete.setEnabled(false);
add(delete);
}
if (addLayers && add != null) {
add(add);
}
}
/**
* Set the panel that brings up an interface to dynamically add
* layers.
*/
public void setLayerAddPanel(LayerAddPanel lap) {
layerAddPanel = lap;
if (layerAddPanel != null) {
add = new JButton(addgif);
add.setActionCommand(LayersPanel.LayerAddCmd);
add.setToolTipText(i18n.get(LayerControlButtonPanel.class,
"addLayer",
"Add a layer"));
add.addActionListener(this);
if (addLayers) {
this.add(add);
}
} else if (add != null) {
this.remove(add);
}
}
/**
* Get the panel interface to dynamically add layers.
*/
public LayerAddPanel getLayerAddPanel() {
return layerAddPanel;
}
/**
* Method associated with the ActionListener interface. This
* method listens for action events meant to change the order of
* the layers, as fired by the layer order buttons.
*
* @param e ActionEvent
*/
public void actionPerformed(java.awt.event.ActionEvent e) {
String command = e.getActionCommand();
if (Debug.debugging("layerbuttons")) {
Debug.output("LayersPanel.actionPerformed(): " + command);
}
if (command == LayersPanel.LayerTopCmd
|| command == LayersPanel.LayerBottomCmd
|| command == LayersPanel.LayerUpCmd
|| command == LayersPanel.LayerDownCmd
|| command == LayersPanel.LayerRemoveCmd) {
if (selected != null) {
if (Debug.debugging("layercontrol")) {
Debug.output("LayerControlButtonPanel: button firing "
+ command + " event for " + selected.getName());
}
firePropertyChange(command, null, selected);
} else {
if (Debug.debugging("layercontrol")) {
Debug.output("LayerControlButtonPanel: button firing "
+ command + " event with no layer selected");
}
}
if (command == LayersPanel.LayerRemoveCmd) {
// We are going to be deleting the layer we've selected.
selected = null;
delete.setEnabled(false);
}
} else if (command.equals(LayersPanel.LayerAddCmd)) {
if (layerAddPanel != null) {
layerAddPanel.showPanel();
}
}
}
protected Layer selected = null;
public void propertyChange(PropertyChangeEvent pce) {
String command = pce.getPropertyName();
Object obj = pce.getNewValue();
if (Debug.debugging("layercontrol")) {
Debug.output("LayerControlButtonPanel: receiving PropertyChangeEvent "
+ pce.getPropertyName());
}
if (command == LayersPanel.LayerSelectedCmd && obj instanceof Layer) {
selected = (Layer) obj;
delete.setEnabled(selected.isRemovable());
if (Debug.debugging("layercontrol")) {
Debug.output("LayerControlButtonPanel: got notification that layer is selected: "
+ selected.getName());
}
} else if (command == LayersPanel.LayerDeselectedCmd && selected == obj) {
selected = null;
delete.setEnabled(false);
}
}
public void findAndInit(Object someObj) {
if (someObj instanceof LayerAddPanel) {
setLayerAddPanel((LayerAddPanel) someObj);
}
if (someObj instanceof LayersPanel) {
setLayersPanel((LayersPanel) someObj);
}
}
public void findAndUndo(Object someObj) {
if (someObj instanceof LayerAddPanel) {
if (getLayerAddPanel() == someObj) {
setLayerAddPanel(null);
}
}
if (someObj instanceof LayersPanel) {
removeLayersPanel((LayersPanel) someObj);
}
}
public void setProperties(String prefix, Properties props) {
super.setProperties(prefix, props);
prefix = PropUtils.getScopedPropertyPrefix(prefix);
configuration = props.getProperty(prefix + ConfigurationProperty);
if (configuration == null) {
configuration = DefaultConfiguration;
}
embedded = PropUtils.booleanFromProperties(props, prefix
+ EmbeddedProperty, embedded);
deleteLayers = PropUtils.booleanFromProperties(props, prefix
+ DeleteLayersProperty, deleteLayers);
addLayers = PropUtils.booleanFromProperties(props, prefix
+ AddLayersProperty, addLayers);
String orient = props.getProperty(prefix + OrientationProperty);
if (orient != null
&& (orient.equalsIgnoreCase(HORIZONTAL_CONFIG) || (orient.equalsIgnoreCase("false")))) {
boxOrientation = BoxLayout.X_AXIS;
}
}
public Properties getProperties(Properties props) {
props = super.getProperties(props);
String prefix = PropUtils.getScopedPropertyPrefix(this);
props.put(prefix + ConfigurationProperty, configuration);
props.put(prefix + OrientationProperty,
(boxOrientation == BoxLayout.X_AXIS ? HORIZONTAL_CONFIG
: VERTICAL_CONFIG));
props.put(prefix + EmbeddedProperty, new Boolean(embedded).toString());
props.put(prefix + DeleteLayersProperty,
new Boolean(deleteLayers).toString());
props.put(prefix + AddLayersProperty, new Boolean(addLayers).toString());
return props;
}
public Properties getPropertyInfo(Properties props) {
props = super.getPropertyInfo(props);
String interString = i18n.get(LayerControlButtonPanel.class,
ConfigurationProperty,
I18n.TOOLTIP,
"Pre-Defined Configuration String (WEST, EAST, NORTH, SOUTH, NORTH_SOUTH).");
props.put(ConfigurationProperty, interString);
props.put(ConfigurationProperty + ScopedEditorProperty,
"com.bbn.openmap.util.propertyEditor.ComboBoxPropertyEditor");
props.put(ConfigurationProperty + OptionPropertyEditor.ScopedOptionsProperty,
"west east north south northsouth");
props.put(ConfigurationProperty + ".west", "WEST");
props.put(ConfigurationProperty + ".east", "EAST");
props.put(ConfigurationProperty + ".north", "NORTH");
props.put(ConfigurationProperty + ".south", "SOUTH");
props.put(ConfigurationProperty + ".northsouth", "NORTH_SOUTH");
interString = i18n.get(LayerControlButtonPanel.class, ConfigurationProperty, "Configuration");
props.put(ConfigurationProperty + LabelEditorProperty, interString);
interString = i18n.get(LayerControlButtonPanel.class,
ConfigurationProperty,
I18n.TOOLTIP,
"Layout orientation for buttons.");
props.put(OrientationProperty, interString);
props.put(OrientationProperty + ScopedEditorProperty,
"com.bbn.openmap.util.propertyEditor.OrientationPropertyEditor");
interString = i18n.get(LayerControlButtonPanel.class, OrientationProperty, "Orientation");
props.put(OrientationProperty + LabelEditorProperty, interString);
interString = i18n.get(LayerControlButtonPanel.class,
EmbeddedProperty,
I18n.TOOLTIP,
"Insert itself into Layers panel.");
props.put(EmbeddedProperty, interString);
props.put(EmbeddedProperty + ScopedEditorProperty,
"com.bbn.openmap.util.propertyEditor.YesNoPropertyEditor");
interString = i18n.get(LayerControlButtonPanel.class, EmbeddedProperty, "Embedded");
props.put(EmbeddedProperty + LabelEditorProperty, interString);
interString = i18n.get(LayerControlButtonPanel.class,
DeleteLayersProperty,
I18n.TOOLTIP,
"Include button to delete layers.");
props.put(DeleteLayersProperty, interString);
props.put(DeleteLayersProperty + ScopedEditorProperty,
"com.bbn.openmap.util.propertyEditor.YesNoPropertyEditor");
interString = i18n.get(LayerControlButtonPanel.class, DeleteLayersProperty, "Add Remove Button");
props.put(DeleteLayersProperty + LabelEditorProperty, interString);
interString = i18n.get(LayerControlButtonPanel.class,
AddLayersProperty,
I18n.TOOLTIP,
"Include button to add layers.");
props.put(AddLayersProperty, interString);
props.put(AddLayersProperty + ScopedEditorProperty,
"com.bbn.openmap.util.propertyEditor.YesNoPropertyEditor");
interString = i18n.get(LayerControlButtonPanel.class, AddLayersProperty, "Add Create Button");
props.put(AddLayersProperty + LabelEditorProperty, interString);
props.put(initPropertiesProperty, ConfigurationProperty + " " +
EmbeddedProperty + " " +
OrientationProperty + " " +
AddLayersProperty + " " +
DeleteLayersProperty);
return props;
}
}