/*
* Open Source Physics software is free software as described near the bottom of this code file.
*
* For additional information and documentation on Open Source Physics please see:
* <http://www.opensourcephysics.org/>
*/
package org.opensourcephysics.ejs;
import java.awt.Component;
import java.awt.Container;
import java.lang.reflect.Constructor;
import javax.swing.JApplet;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.RootPaneContainer;
import javax.swing.WindowConstants;
import org.opensourcephysics.display.DrawingFrame;
/**
* A utility class to launch simulations
*/
public class LauncherApplet extends JApplet {
private JFrame _parentFrame = null;
public Model _model = null;
public Simulation _simulation = null;
public View _view = null;
// --------------- Application part ----------
/*
static public void main(String[] args) {
Model model = null;
String simClass = null, window = null;
// for (int i=0; i<args.length; i++) System.out.println ("Arg["+i+"] = <"+args[i]+">");
if(args.length>0) {
simClass = args[0];
}
if(args.length>1) {
window = args[1];
}
LauncherApplet la = new LauncherApplet();
if(window!=null) {
la._parentFrame = new JFrame();
la._parentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
la._parentFrame.setTitle("Captured");
la._parentFrame.setLocation(400, 0);
la._parentFrame.setVisible(true);
la._model = createModel(simClass, window, la._parentFrame, null);
la._simulation = la._model.getSimulation();
la._view = la._model.getView();
la.captureWindow(la._model.getView(), window);
} else {
la._model = createModel(simClass, null, null, null);
la._simulation = la._model.getSimulation();
la._view = la._model.getView();
}
} */
// ----------------- Applet part -----------------
public String getParameter(String key, String def) {
return((getParameter(key)!=null) ? getParameter(key) : def);
}
public void _play() {
_simulation.play();
}
public void _pause() {
_simulation.pause();
}
public void _step() {
_simulation.step();
}
public void _setFPS(int _fps) {
_simulation.setFPS(_fps);
}
public void _setDelay(int _delay) {
_simulation.setDelay(_delay);
}
public void _reset() {
_simulation.reset();
}
public void _initialize() {
_simulation.initialize();
}
public boolean _saveState(String _filename) {
return _simulation.saveState(_filename);
}
public boolean _readState(String _filename) {
return _simulation.readState(_filename, getCodeBase());
}
public boolean _setVariables(String _command, String _delim, String _arrayDelim) {
return _simulation.setVariables(_command, _delim, _arrayDelim);
}
public boolean _setVariables(String _command) {
return _simulation.setVariables(_command);
}
public String _getVariable(String _varName) {
return _simulation.getVariable(_varName);
}
public void _resetView() {
_view.reset();
}
/** Initialize the applet */
public void init() {
String simClass = null;
String windowToCapture = null;
try {
simClass = this.getParameter("simulation", null); //$NON-NLS-1$
} catch(Exception e) {
e.printStackTrace();
}
try {
windowToCapture = this.getParameter("capture", null); //$NON-NLS-1$
} catch(Exception e) {
e.printStackTrace();
}
if((windowToCapture!=null)&&(getParentFrame()!=null)&&(getParentFrame()!=null)) {
// System.out.println ("Parent Frame is "+getParentFrame().getName());
_model = createModel(simClass, windowToCapture, getParentFrame(), getCodeBase());
_simulation = _model.getSimulation();
_view = _model.getView();
captureWindow(_model.getView(), windowToCapture);
} else {
_model = createModel(simClass, null, null, getCodeBase());
_simulation = _model.getSimulation();
_view = _model.getView();
}
}
// public void destroy(){
// System.out.println("LauncherApplet destroy Method.");
// super.destroy();
// }
//
// public void stop(){
// System.out.println("LauncherApplet stop Method.");
// super.stop();
// }
//
// public void start(){
// System.out.println("LauncherApplet start Method.");
// super.start();
// }
//
// public String getAppletInfo () {
// return "An applet to launch a Simulation.";
// }
public String[][] getParameterInfo() {
String[][] pinfo = {
{"simulation", "String", "The simulation"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
{"capture", "String", "The name of the component to be captured"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
};
return pinfo;
}
private java.awt.Frame getParentFrame() {
java.awt.Container parent = getParent();
while(parent!=null) {
if(parent instanceof java.awt.Frame) {
return(java.awt.Frame) parent;
}
parent = parent.getParent();
}
return null;
}
// ------ Common stuff
static Model createModel(String simClass, String _ownerName, java.awt.Frame _ownerFrame, java.net.URL _codebase) {
Model aModel = null;
if((_ownerName!=null)||(_codebase!=null)) {
try { // Instantiate a model with the given name and three parameters
Class<?> c = Class.forName(simClass);
Constructor<?>[] constructors = c.getConstructors();
for(int i = 0; i<constructors.length; i++) {
Class<?>[] parameters = constructors[i].getParameterTypes();
if((parameters.length==3)&¶meters[0].isAssignableFrom(_ownerName.getClass())&¶meters[1].isAssignableFrom(_ownerFrame.getClass())&¶meters[2].isAssignableFrom(_codebase.getClass())) {
aModel = (Model) constructors[i].newInstance(new Object[] {_ownerName, _ownerFrame, _codebase});
break;
}
}
} catch(Exception exc) {
exc.printStackTrace();
aModel = null;
}
}
if(aModel==null) {
try { // Now try a simple constructor
Class<?> aClass = Class.forName(simClass);
aModel = (Model) aClass.newInstance();
} catch(Exception exc) {
exc.printStackTrace();
return null;
}
}
return aModel;
}
private void captureWindow(View _aView, String _aWindow) {
if(_aWindow==null) {
return;
}
RootPaneContainer root;
if(_parentFrame!=null) {
root = _parentFrame;
} else {
root = this;
}
Component comp = _aView.getComponent(_aWindow);
if(comp==null) {
return;
}
//Dimension size = comp.getSize();
if(comp instanceof DrawingFrame) {
comp.setVisible(true);
Container contentPane = ((RootPaneContainer) comp).getContentPane();
contentPane.setVisible(true);
root.setContentPane(contentPane);
Component glassPane = ((RootPaneContainer) comp).getGlassPane();
root.setGlassPane(glassPane);
glassPane.setVisible(true);
((DrawingFrame) comp).setKeepHidden(true);
((DrawingFrame) comp).setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
} else if(comp instanceof JDialog) {
comp.setVisible(true);
Container contentPane = ((RootPaneContainer) comp).getContentPane();
contentPane.setVisible(true);
root.setContentPane(contentPane);
Component glassPane = ((RootPaneContainer) comp).getGlassPane();
root.setGlassPane(glassPane);
glassPane.setVisible(true);
((JDialog) comp).dispose();
} else {
root.getContentPane().setLayout(new java.awt.BorderLayout());
root.getContentPane().add(comp, java.awt.BorderLayout.CENTER);
root.getContentPane().validate();
Container oldParent = comp.getParent();
if(oldParent!=null) {
oldParent.validate();
}
}
if(_parentFrame!=null) {
_parentFrame.pack();
}
}
} // End of class
/*
* Open Source Physics software is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public License (GPL) as
* published by the Free Software Foundation; either version 2 of the License,
* or(at your option) any later version.
* Code that uses any portion of the code in the org.opensourcephysics package
* or any subpackage (subdirectory) of this package must must also be be released
* under the GNU GPL license.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA
* or view the license online at http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2007 The Open Source Physics project
* http://www.opensourcephysics.org
*/