// ********************************************************************** // // <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/distapps/openmap/src/openmap/com/bbn/openmap/gui/NavigatePanel.java,v $ // $RCSfile: NavigatePanel.java,v $ // $Revision: 1.11 $ // $Date: 2005/08/10 21:30:47 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.gui; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionListener; import java.io.Serializable; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; import com.bbn.openmap.Environment; import com.bbn.openmap.event.CenterListener; import com.bbn.openmap.event.CenterSupport; import com.bbn.openmap.event.PanListener; import com.bbn.openmap.event.PanSupport; import com.bbn.openmap.util.Debug; /** * A Navigation Rosette Bean. This bean is a source for PanEvents and * CenterEvents. */ public class NavigatePanel extends OMToolComponent implements Serializable, ActionListener { public final static String panNWCmd = "panNW"; public final static String panNCmd = "panN"; public final static String panNECmd = "panNE"; public final static String panECmd = "panE"; public final static String panSECmd = "panSE"; public final static String panSCmd = "panS"; public final static String panSWCmd = "panSW"; public final static String panWCmd = "panW"; public final static String centerCmd = "center"; protected transient JButton nwButton = null; protected transient JButton nButton = null; protected transient JButton neButton = null; protected transient JButton eButton = null; protected transient JButton seButton = null; protected transient JButton sButton = null; protected transient JButton swButton = null; protected transient JButton wButton = null; protected transient JButton cButton = null; // default icon names protected static String nwName = "nw.gif"; protected static String nName = "n.gif"; protected static String neName = "ne.gif"; protected static String eName = "e.gif"; protected static String seName = "se.gif"; protected static String sName = "s.gif"; protected static String swName = "sw.gif"; protected static String wName = "w.gif"; protected static String cName = "center.gif"; protected PanSupport panDelegate; protected CenterSupport centerDelegate; protected boolean useTips = false; protected float panFactor = 1f; // protected int height = 0; // calculated // protected int width = 0; // calculated protected boolean useDefaultCenter = false; protected float defaultCenterLat = 0; protected float defaultCenterLon = 0; public final static String defaultKey = "navigatepanel"; /** * Construct the NavigationPanel. */ public NavigatePanel() { super(); setKey(defaultKey); panDelegate = new PanSupport(this); centerDelegate = new CenterSupport(this); JPanel panel = new JPanel(); GridBagLayout internalGridbag = new GridBagLayout(); GridBagConstraints c2 = new GridBagConstraints(); panel.setLayout(internalGridbag); // begin top row String info = i18n.get(NavigatePanel.class, "panNW.tooltip", "Pan Northwest"); nwButton = getButton(nwName, info, panNWCmd); c2.gridx = 0; c2.gridy = 0; internalGridbag.setConstraints(nwButton, c2); panel.add(nwButton); info = i18n.get(NavigatePanel.class, "panN.tooltip", "Pan North"); nButton = getButton(nName, info, panNCmd); c2.gridx = 1; c2.gridy = 0; internalGridbag.setConstraints(nButton, c2); panel.add(nButton); info = i18n.get(NavigatePanel.class, "panNE.tooltip", "Pan Northeast"); neButton = getButton(neName, info, panNECmd); c2.gridx = 2; c2.gridy = 0; internalGridbag.setConstraints(neButton, c2); panel.add(neButton); // begin middle row info = i18n.get(NavigatePanel.class, "panW.tooltip", "Pan West"); wButton = getButton(wName, info, panWCmd); c2.gridx = 0; c2.gridy = 1; internalGridbag.setConstraints(wButton, c2); panel.add(wButton); info = i18n.get(NavigatePanel.class, "center.tooltip", "Center Map at Starting Coords"); cButton = getButton(cName, info, centerCmd); c2.gridx = 1; c2.gridy = 1; internalGridbag.setConstraints(cButton, c2); panel.add(cButton); info = i18n.get(NavigatePanel.class, "panE.tooltip", "Pan East"); eButton = getButton(eName, info, panECmd); c2.gridx = 2; c2.gridy = 1; internalGridbag.setConstraints(eButton, c2); panel.add(eButton); // begin bottom row info = i18n.get(NavigatePanel.class, "panSW.tooltip", "Pan Southwest"); swButton = getButton(swName, info, panSWCmd); c2.gridx = 0; c2.gridy = 2; internalGridbag.setConstraints(swButton, c2); panel.add(swButton); info = i18n.get(NavigatePanel.class, "panS.tooltip", "Pan South"); sButton = getButton(sName, info, panSCmd); c2.gridx = 1; c2.gridy = 2; internalGridbag.setConstraints(sButton, c2); panel.add(sButton); info = i18n.get(NavigatePanel.class, "panSE.tooltip", "Pan Southeast"); seButton = getButton(seName, info, panSECmd); c2.gridx = 2; c2.gridy = 2; internalGridbag.setConstraints(seButton, c2); panel.add(seButton); add(panel); } /** * Add the named button to the panel. * * @param name GIF image name * @param info ToolTip text * @param command String command name * */ protected JButton getButton(String name, String info, String command) { URL url = NavigatePanel.class.getResource(name); ImageIcon icon = new ImageIcon(url, info); JButton b = new JButton(icon); b.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight())); b.setToolTipText(info); b.setMargin(new Insets(0, 0, 0, 0)); b.setActionCommand(command); b.addActionListener(this); b.setBorderPainted(Debug.debugging("layout")); b.setOpaque(false); return b; } /** * Add a CenterListener. * * @param listener CenterListener */ public synchronized void addCenterListener(CenterListener listener) { centerDelegate.add(listener); } /** * Remove a CenterListener * * @param listener CenterListener */ public synchronized void removeCenterListener(CenterListener listener) { centerDelegate.remove(listener); } /** * Add a PanListener. * * @param listener PanListener */ public synchronized void addPanListener(PanListener listener) { panDelegate.add(listener); } /** * Remove a PanListener * * @param listener PanListener */ public synchronized void removePanListener(PanListener listener) { panDelegate.remove(listener); } /** * Fire a CenterEvent. */ protected synchronized void fireCenterEvent(float lat, float lon) { centerDelegate.fireCenter(lat, lon); } /** * Fire a PanEvent. * * @param az azimuth east of north */ protected synchronized void firePanEvent(float az) { panDelegate.firePan(az); } /** * Get the pan factor. * <p> * The panFactor is the amount of screen to shift when panning in * a certain direction: 0=none, 1=half-screen shift. * * @return float panFactor (0.0 <= panFactor <= 1.0) */ public float getPanFactor() { return panFactor; } /** * Set the pan factor. * <p> * This defaults to 1.0. The panFactor is the amount of screen to * shift when panning in a certain direction: 0=none, * 1=half-screen shift. * * @param panFactor (0.0 <= panFactor <= 1.0) */ public void setPanFactor(float panFactor) { if ((panFactor < 0f) || (panFactor > 1f)) { throw new IllegalArgumentException("should be: (0.0 <= panFactor <= 1.0)"); } this.panFactor = panFactor; } /** * Use this function to set where you want the map projection to * pan to when the user clicks on "center" button on the * navigation panel. The scale does not change. When you call this * function, the projection does not change. * * @param passedLat float the center latitude (in degrees) * @param passedLon float the center longitude (in degrees) */ public void setDefaultCenter(float passedLat, float passedLon) { useDefaultCenter = true; defaultCenterLat = passedLat; defaultCenterLon = passedLon; } /** * ActionListener Interface. * * @param e ActionEvent */ public void actionPerformed(java.awt.event.ActionEvent e) { String command = e.getActionCommand(); Debug.message("navpanel", "NavigatePanel.actionPerformed(): " + command); if (command.equals(panNWCmd)) { firePanEvent(-45f); } else if (command.equals(panNCmd)) { firePanEvent(0f); } else if (command.equals(panNECmd)) { firePanEvent(45f); } else if (command.equals(panECmd)) { firePanEvent(90f); } else if (command.equals(panSECmd)) { firePanEvent(135f); } else if (command.equals(panSCmd)) { firePanEvent(180f); } else if (command.equals(panSWCmd)) { firePanEvent(-135f); } else if (command.equals(panWCmd)) { firePanEvent(-90f); } else if (command.equals(centerCmd)) { // go back to the center point float lat; float lon; if (useDefaultCenter) { lat = defaultCenterLat; lon = defaultCenterLon; } else { lat = Environment.getFloat(Environment.Latitude, 0f); lon = Environment.getFloat(Environment.Longitude, 0f); } fireCenterEvent(lat, lon); } } // ///////////////////////////////////////////////////////////////////////// // // OMComponentPanel methods to make the tool work with // // the MapHandler to find objects it needs. // ///////////////////////////////////////////////////////////////////////// public void findAndInit(Object obj) { if (obj instanceof PanListener) { addPanListener((PanListener) obj); } if (obj instanceof CenterListener) { addCenterListener((CenterListener) obj); } } public void findAndUndo(Object obj) { if (obj instanceof PanListener) { removePanListener((PanListener) obj); } if (obj instanceof CenterListener) { removeCenterListener((CenterListener) obj); } } }