// **********************************************************************
//
// <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/app/OpenMapApplet.java,v $
// $RCSfile: OpenMapApplet.java,v $
// $Revision: 1.9 $
// $Date: 2005/07/29 19:17:48 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.app;
import java.awt.Container;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.beans.beancontext.BeanContext;
import java.beans.beancontext.BeanContextChild;
import java.beans.beancontext.BeanContextChildSupport;
import java.beans.beancontext.BeanContextMembershipEvent;
import java.beans.beancontext.BeanContextMembershipListener;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator;
import javax.swing.JApplet;
import javax.swing.JMenuBar;
import com.bbn.openmap.Environment;
import com.bbn.openmap.MapBean;
import com.bbn.openmap.PropertyHandler;
import com.bbn.openmap.gui.BasicMapPanel;
import com.bbn.openmap.gui.MapPanel;
import com.bbn.openmap.util.Debug;
/**
* OpenMap Applet. Uses the MapHandler, via BeanContextMembershipListener
* methods to lay out the MapPanel and JMenuBar. Creates a PropertyHandler that
* will look for the openmap.properties file in the codebase. If the
*
* <pre>
* PROPERTIES
* </pre>
*
* applet parameter is specified with a different properties file, that file
* will be used instead.
*/
public class OpenMapApplet
extends JApplet
implements BeanContextMembershipListener, BeanContextChild {
public final static String PropertiesProperty = "PROPERTIES";
/**
* BeanContextChildSupport object provides helper functions for
* BeanContextChild interface.
*/
private BeanContextChildSupport beanContextChildSupport = new BeanContextChildSupport();
// pinfo used to have these parameters, too, but that doesn't
// seem right to include visibroker arguments in the generic
// applet parameter info.
// {"ORBdisableLocator", "boolean", "disable Visiborker
// Gatekeeper"},
// {"ORBgatekeeperIOR", "boolean", "URL to gatekeeper IOR."},
protected final String pinfo[][] = {
{
Environment.Latitude,
"float",
"Starting center latitude"
},
{
Environment.Longitude,
"float",
"Starting center longitude"
},
{
Environment.Scale,
"float",
"Starting Scale"
},
{
Environment.Projection,
"String",
"Default projection type"
},
{
"debug.basic",
"none",
"enable basic debugging"
},
{
Environment.HelpURL,
"String",
"URL location of OpenMap help pages"
}
};
/**
* Returns information about this applet.
* <p>
*
* @return a string containing information about the author, version, and
* copyright of the applet.
* @since JDK1.0
*/
public String getAppletInfo() {
return MapBean.getCopyrightMessage();
}
/**
* Returns information about the parameters that are understood by this
* applet.
* <p>
* Each element of the array should be a set of three <code>Strings</code>
* containing the name, the type, and a description. For example:
* <p>
* <blockquote>
*
* <pre>
* String pinfo[][] = {
* {
* "fps",
* "1-10",
* "frames per second"
* },
* {
* "repeat",
* "boolean",
* "repeat image loop"
* },
* {
* "imgs",
* "url",
* "images directory"
* }
* };
* </pre>
*
* </blockquote>
* <p>
*
* @return an array describing the parameters this applet looks for.
* @since JDK1.0
*/
public String[][] getParameterInfo() {
return pinfo;
}
/**
* Called by the browser or applet viewer to inform this applet that it has
* been loaded into the system. It is always called before the first time
* that the <code>start</code> method is called.
* <p>
* The implementation of this method provided by the <code>Applet</code>
* class does nothing.
*
* @see java.applet.Applet#destroy()
* @see java.applet.Applet#start()
* @see java.applet.Applet#stop()
* @since JDK1.0
*/
public void init() {
// Initialize as an applet
Environment.init(this);
Debug.init(this, new String[] {
"debug.basic",
"debug.cspec",
"debug.layer",
"debug.mapbean",
"debug.plugin"
});
String propValue = getParameter(PropertiesProperty);
PropertyHandler propHandler = null;
try {
if (propValue != null) {
PropertyHandler.Builder builder = new PropertyHandler.Builder().setPropertiesFile(propValue);
propHandler = new PropertyHandler(builder);
if (Debug.debugging("app")) {
Debug.output("OpenMapApplet: Using properties from " + propValue);
}
}
} catch (MalformedURLException murle) {
Debug.error("OpenMap: property file specified: " + propValue
+ " doesn't exist, searching for default openmap.properties file...");
} catch (IOException ioe) {
Debug.error("OpenMap: There is a problem using the property file specified: " + propValue
+ ", searching for default openmap.properties file...");
}
if (propHandler == null) {
propHandler = new PropertyHandler();
}
MapPanel mapPanel = new BasicMapPanel(propHandler);
mapPanel.getMapHandler().add(this);
Debug.message("app", "OpenMapApplet.init()");
}
/**
* Called by the browser or applet viewer to inform this applet that it
* should start its execution. It is called after the <code>init</code>
* method and each time the applet is revisited in a Web page.
* <p>
*
* @see java.applet.Applet#destroy()
* @see java.applet.Applet#init()
* @see java.applet.Applet#stop()
* @since JDK1.0
*/
public void start() {
Debug.message("app", "OpenMapApplet.start()");
super.start();
}
/**
* Called by the browser or applet viewer to inform this applet that it
* should stop its execution. It is called when the Web page that contains
* this applet has been replaced by another page, and also just before the
* applet is to be destroyed.
* <p>
*
* @see java.applet.Applet#destroy()
* @see java.applet.Applet#init()
* @since JDK1.0
*/
public void stop() {
Debug.message("app", "OpenMapApplet.stop()");
super.stop();
}
/**
* Called by the browser or applet viewer to inform this applet that it is
* being reclaimed and that it should destroy any resources that it has
* allocated. The <code>stop</code> method will always be called before
* <code>destroy</code>.
* <p>
*
* @see java.applet.Applet#init()
* @see java.applet.Applet#start()
* @see java.applet.Applet#stop()
* @since JDK1.0
*/
public void destroy() {
Debug.message("app", "OpenMapApplet.destroy()");
super.destroy();
}
/**
* The method called by BeanContextMembershipListener methods to find
* components in the MapHandler.
*/
public void findAndInit(Iterator it) {
while (it.hasNext()) {
findAndInit(it.next());
}
}
/**
* Called when an object is added to the MapHandler.
*/
public void findAndInit(Object someObj) {
if (someObj instanceof MapPanel && someObj instanceof Container) {
getContentPane().add((Container) someObj);
JMenuBar jmb = ((MapPanel) someObj).getMapMenuBar();
if (jmb != null) {
Debug.message("basic", "OpenMapApplet: Got MenuBar from MapPanel");
getRootPane().setJMenuBar(jmb);
}
invalidate();
}
if (someObj instanceof JMenuBar) {
getRootPane().setJMenuBar((JMenuBar) someObj);
invalidate();
}
}
/**
* BeanContextMembership interface method. Called when objects are added to
* the BeanContext.
*
* @param bcme contains an Iterator that lets you go through the new
* objects.
*/
public void childrenAdded(BeanContextMembershipEvent bcme) {
findAndInit(bcme.iterator());
}
/**
* BeanContextMembership interface method. Called by BeanContext when
* children are being removed. Unhooks itself from the objects that are
* being removed if they are contained within the Frame.
*
* @param bcme event that contains an Iterator to use to go through the
* removed objects.
*/
public void childrenRemoved(BeanContextMembershipEvent bcme) {
for (Iterator it = bcme.iterator(); it.hasNext();) {
findAndUndo(it.next());
}
}
/**
* Called when an object is removed from the MapHandler.
*/
public void findAndUndo(Object someObj) {
if (someObj instanceof MapPanel && someObj instanceof Container) {
Debug.message("basic", "OpenMapApplet: MapPanel is being removed from applet");
getContentPane().remove((Container) someObj);
if (getJMenuBar() == ((MapPanel) someObj).getMapMenuBar()) {
Debug.message("basic", "OpenMapApplet: Menu Bar is being removed");
setJMenuBar(null);
}
}
if (someObj instanceof JMenuBar) {
if (getJMenuBar() == (JMenuBar) someObj) {
Debug.message("basic", "OpenMapApplet: MenuBar is being removed from applet");
setJMenuBar(null);
}
}
}
/** Method for BeanContextChild interface. */
public BeanContext getBeanContext() {
return beanContextChildSupport.getBeanContext();
}
/**
* Method for BeanContextChild interface.
*
* @param in_bc The context to which this object is being added
*/
public void setBeanContext(BeanContext in_bc)
throws PropertyVetoException {
if (in_bc != null) {
in_bc.addBeanContextMembershipListener(this);
beanContextChildSupport.setBeanContext(in_bc);
findAndInit(in_bc.iterator());
}
}
/** Method for BeanContextChild interface. */
public void addVetoableChangeListener(String propertyName, VetoableChangeListener in_vcl) {
beanContextChildSupport.addVetoableChangeListener(propertyName, in_vcl);
}
/** Method for BeanContextChild interface. */
public void removeVetoableChangeListener(String propertyName, VetoableChangeListener in_vcl) {
beanContextChildSupport.removeVetoableChangeListener(propertyName, in_vcl);
}
}