// ********************************************************************** // // <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/graphicLoader/AbstractGraphicLoader.java,v $ // $RCSfile: AbstractGraphicLoader.java,v $ // $Revision: 1.5 $ // $Date: 2005/08/09 17:44:07 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.graphicLoader; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Properties; import javax.swing.Timer; import com.bbn.openmap.OMComponent; import com.bbn.openmap.omGraphics.OMGraphicHandler; import com.bbn.openmap.proj.Projection; import com.bbn.openmap.util.PropUtils; /** * The abstract AbstractGraphicLoader class is an OMGraphic managing * object. It can talk to any source it wants to for configuring its * OMGraphicList, and then notifies its OMGraphicHandler with the * changes. The AbstractGraphicLoader comes with a built-in timer, in * case you want to check back with the graphic source within certain * intervals in order to update the graphics in an animated fashion. * This class also extends MapHandlerChild so if you want to add it to * the MapHandler to find other objects, you can override the * findAndInit() method. * <P> * * This object is really intended to be used with the * GraphicLoaderPlugIn, but it doesn't really have to be. If you have * a GraphicLoaderConnector in the MapHandler and then add a * GraphicLoader to the MapHandler, the GraphicLoaderConnector will * check to see if the GraphicLoader has a receiver. If there isn't a * receiver, the GraphicLoaderConnetor will create a * GraphicLoaderPlugIn for you, connect the GraphicLoader to it, and * then add the GraphicLoaderPlugIn to the LayerHandler. Then, the * GraphicLoader will have its graphics on the map. */ public abstract class AbstractGraphicLoader extends OMComponent implements GraphicLoader, ActionListener { protected Timer timer; protected int DO_NOT_UPDATE_TIMER = -1; protected OMGraphicHandler receiver = null; protected Projection proj; // last projection protected String name = ""; public final static String TimerCmd = "TimerCommand"; public final static String NameProperty = "prettyName"; public AbstractGraphicLoader() { createTimer(); } public AbstractGraphicLoader(OMGraphicHandler receiver) { super(); setReceiver(receiver); manageGraphics(); } /** * The method where the AbstractGraphicLoader is expected to tell * the receiver what the OMGraphics are. This gets called by * default by the actionPerformed() method, which is called by * default by the built-in timer when it is running. * * @see com.bbn.openmap.omGraphics.OMGraphicHandler#setList(OMGraphicList) */ public abstract void manageGraphics(); /** * Provide a GUI for controlling the GraphicLoader. It's OK if * it's null. */ public Component getGUI() { return null; } /** * Calls manageGraphics() if projection is different(). */ public void setProjection(Projection p) { if (!p.equals(getProjection())) { proj = p; manageGraphics(); } } public Projection getProjection() { return proj; } public void setReceiver(OMGraphicHandler r) { receiver = r; } public OMGraphicHandler getReceiver() { return receiver; } /** * Get the timer being used for automatic updates. May be null if * a timer is not set. */ public Timer getTimer() { return timer; } /** * If you want the layer to update itself at certain intervals, * you can set the timer to do that. Set it to null to disable it. * If the current timer is not null, the graphic loader is removed * as an ActionListener. If the new one is not null, the graphic * loader is added as an ActionListener. */ public void setTimer(Timer t) { if (timer != null) { timer.stop(); timer.removeActionListener(this); } timer = t; if (timer != null) { timer.addActionListener(this); } } /** * Creates a timer with the current updateInterval and calls * setTimer(). */ public void createTimer() { Timer t = new Timer(updateInterval, this); t.setInitialDelay(0); setTimer(t); } /** * The delay between timer pulses, in milliseconds. */ protected int updateInterval = 3000; public void setUpdateInterval(int delay) { updateInterval = delay; if (timer != null) { timer.setDelay(updateInterval); if (timer.isRunning()) { timer.restart(); } } } public int getUpdateInterval() { return updateInterval; } /** * Method gets called by the timer if it's running. Will also get * called if any other component is using this class as an * ActionListener. By default, calls manageGraphics(); */ public void actionPerformed(ActionEvent ae) { manageGraphics(); } /** * Return a pretty name for the GUI to let folks know what the * loader does. */ public String getName() { return name; } public void setName(String name) { this.name = name; } public void setProperties(String prefix, Properties props) { super.setProperties(prefix, props); prefix = PropUtils.getScopedPropertyPrefix(prefix); name = props.getProperty(prefix + NameProperty, name); } public Properties getProperties(Properties props) { props = super.getProperties(props); String prefix = PropUtils.getScopedPropertyPrefix(this); props.put(prefix + NameProperty, getName()); return props; } public Properties getPropertyInfo(Properties list) { list = super.getPropertyInfo(list); list.put(NameProperty, "A short name description for what this GraphicLoader does."); return list; } }