520 lines
18 KiB
Java
520 lines
18 KiB
Java
/*
|
||
File: InfoBox.java
|
||
|
||
University of Applied Science Berne,HTA-Biel/Bienne,
|
||
Computer Science Department.
|
||
|
||
Diploma thesis J3D Solar System Simulator
|
||
Originally written by Marcel Portner & Bernhard Hari (c) 2000
|
||
|
||
CVS - Information :
|
||
|
||
$Header: /var/cvsreps/projects/c450/2000/sss3d/source_diploma/sss3d/gui/infobox/InfoBox.java,v 1.18 2000/12/15 02:56:36 portm Exp $
|
||
$Author: portm $
|
||
$Date: 2000/12/15 02:56:36 $
|
||
$State: Exp $
|
||
|
||
*/
|
||
package sss3d.gui.infobox;
|
||
|
||
import sss3d.contentbranch.*;
|
||
import sss3d.utils.observer.*;
|
||
import sss3d.utils.SSS3dConstants;
|
||
import sss3d.gui.*;
|
||
import sss3d.*;
|
||
import sss3d.utils.xmlparser.XMLConstants;
|
||
|
||
import java.awt.*;
|
||
import javax.vecmath.*;
|
||
import java.awt.event.*;
|
||
import javax.swing.*;
|
||
import javax.swing.event.*;
|
||
|
||
/**
|
||
* Infobox creates a JFrame containing all information about the simulator. Also, it
|
||
* allows to control the simulator by changing values.
|
||
*
|
||
* @author Marcel Portner & Bernhard Hari
|
||
* @version $Revision: 1.18 $
|
||
*/
|
||
public class InfoBox extends JFrame implements PositionObserver, InfoObserver, Runnable {
|
||
|
||
private JTabbedPane jtp; // swing component used to display positons and
|
||
// information inside the main window
|
||
private SolarSystemSimulator sss; // link to control simulation
|
||
|
||
private JFrame frame; // main frame of infobox
|
||
private Thread thread; // infobox runs in a own thread
|
||
|
||
public JMenuItem miGo, miStop, miRot;
|
||
|
||
public JMenu mObjectsPos;
|
||
public JMenu mObjectsInfo;
|
||
public JMenu mObjectsHide;
|
||
public JMenu mObjectsColor;
|
||
|
||
// about dialog box
|
||
private JDialog aboutBox;
|
||
private String aboutText = "Ziel der Diplomarbeit ist es, ein Java3D-Programm zu entwickeln,\n"+
|
||
"welches eine virtuelle dreidimensionale animierte Darstellung des\n"+
|
||
"Sonnensystems simuliert. Diese virtuelle animierte Darstellung wird\n"+
|
||
"die Sonne, alle Planeten mit ihren Satelliten (Monde) und die \n"+
|
||
"bekanntesten periodischen Kometen enthalten. Die Umlaufbahn der\n"+
|
||
"Planeten werden nach dem Kepler Gesetzt berechnet und durch farbige\n"+
|
||
"Ellipsen dargestellt. Man hat zus<75>tzlich die M<>glichkeit die \n"+
|
||
"Konstellation des Planetensystem ab einem bestimmten Datum zu\n"+
|
||
"simulieren und sich dann im Sonnensystem zu navigieren. Wenn der\n"+
|
||
"Programmben<EFBFBD>tzer eine 3D-Schutterbrille besitzt, wird er auch die\n"+
|
||
"M<EFBFBD>glichkeit haben, das Sonnensystem in 3D zu betrachten.\n"+
|
||
"J3D - Solar System Simulator wird komplett in Java geschrieben und\n"+
|
||
"l<EFBFBD>uft somit auf allen Plattformen die Java2 und Java3D unterst<73>tzen.\n";
|
||
|
||
|
||
private ObjectsPositions objPos;
|
||
private ObjectsInformation objInfo;
|
||
private InitializationObject iniObject;
|
||
|
||
private Dimension screenSize;
|
||
|
||
/**
|
||
* Constructs an InfoBox.
|
||
* @param solar reference to the instance of the solar system simulator
|
||
* @param objPos reference to the positions of all objects
|
||
* @param objInfo reference to the informations of all objects
|
||
*/
|
||
public InfoBox( SolarSystemSimulator solar, ObjectsPositions objPos, ObjectsInformation objInfo ) {
|
||
|
||
super("InfoBox - J3D Solar System Simulator Version 1.0");
|
||
|
||
sss = solar;
|
||
|
||
this.objPos = objPos;
|
||
this.objPos.attach(this);
|
||
this.objInfo = objInfo;
|
||
this.objInfo.attach(this);
|
||
iniObject = objInfo.getInitializationObject();
|
||
|
||
thread = new Thread(this, "InfoBox");
|
||
thread.start();
|
||
frame = this;
|
||
}
|
||
|
||
/**
|
||
* Run method creates JFrame.
|
||
*/
|
||
public void run() {
|
||
this.setSize(800,550);
|
||
this.setLocation(20, 20);
|
||
|
||
this.addWindowListener(new WindowCmd());
|
||
|
||
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
|
||
|
||
JPanel panel = new JPanel(new BorderLayout());
|
||
jtp = new JTabbedPane();
|
||
panel.add(jtp, BorderLayout.CENTER);
|
||
|
||
panel.add(createMenuBar(), BorderLayout.NORTH);
|
||
this.getContentPane().add(panel);
|
||
|
||
this.setVisible(true);
|
||
}
|
||
|
||
/**
|
||
* Updates objects positions - not in use at the moment.
|
||
*/
|
||
public void update( OrbitPositions orbitPos ){
|
||
|
||
}
|
||
|
||
/**
|
||
* Updates objects positions for a specific object.
|
||
*
|
||
* @param id id of to be updated object
|
||
* @param parameter the parameter that has to be updated
|
||
*/
|
||
public void update( String id, int parameter ) {
|
||
|
||
if ( !id.equals("infobox") &&
|
||
!id.equals("initializationpanel") ) {
|
||
|
||
switch ( parameter ) {
|
||
case SSS3dConstants.STAR_TYPE :
|
||
case SSS3dConstants.PLANET_TYPE :
|
||
case SSS3dConstants.MOON_TYPE :
|
||
case SSS3dConstants.COMET_TYPE :
|
||
case SSS3dConstants.SATELLITE_TYPE :
|
||
case SSS3dConstants.ROCKET_TYPE :
|
||
CelestialObjectInfo coi = objInfo.getInfo(id);
|
||
addInfoTab(coi);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Get the ID from this class.
|
||
*
|
||
* @return String returns the ID.
|
||
*/
|
||
public String getId() {
|
||
return "infobox";
|
||
}
|
||
|
||
/**
|
||
* Returns object information.In this case we don't have information,because the
|
||
* InfoBox isn't a celestial object.
|
||
*
|
||
* @return CelestialObjectInfo returns always null
|
||
*/
|
||
public CelestialObjectInfo getInfo() {
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* Adds an information tab to the main frame.
|
||
*
|
||
* @param CelstialObjectInfo information object
|
||
*/
|
||
public void addInfoTab( CelestialObjectInfo cObjInfo ) {
|
||
int tabs = jtp.getTabCount();
|
||
boolean found = false;
|
||
String id = (cObjInfo.getName()).toLowerCase();
|
||
String text = id +"-info";
|
||
String title = "";
|
||
|
||
// check if tab already exists
|
||
for(int i = 0; i < tabs; i++) {
|
||
title = jtp.getTitleAt(i);
|
||
if(title.equals(text)) {
|
||
found = true;
|
||
}
|
||
}
|
||
|
||
if(!found) {
|
||
jtp.insertTab(text, null, new InfoPanel(cObjInfo, this), null, 0);
|
||
jtp.setSelectedIndex(0);
|
||
// set menu item selected
|
||
JCheckBoxMenuItem jcbmi = null;
|
||
int length = mObjectsInfo.getItemCount();
|
||
for(int i = 0; i < length; i++) {
|
||
jcbmi = (JCheckBoxMenuItem)mObjectsInfo.getItem(i);
|
||
if((jcbmi.getText().toLowerCase()).equals(id)) {
|
||
jcbmi.setState(true);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Removes an information tab from the main frame.
|
||
*
|
||
* @param CelstialObjectInfo to be deleted information object
|
||
*/
|
||
public void removeInfoTab( CelestialObjectInfo cObjInfo ) {
|
||
int tabs = jtp.getTabCount();
|
||
int index = -1;
|
||
String id = (cObjInfo.getName()).toLowerCase()+"-info";
|
||
String title = "";
|
||
|
||
for(int i=0; i < tabs;i++) {
|
||
title = jtp.getTitleAt(i);
|
||
if(title.equals(id)) {
|
||
index = i;
|
||
}
|
||
}
|
||
if(index != -1) {
|
||
jtp.removeTabAt(index);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Adds a position tab to the main frame.
|
||
*
|
||
* @param CelstialObjectInfo information object
|
||
*/
|
||
public void addPosTab( CelestialObjectInfo cObjInfo ) {
|
||
int tabs = jtp.getTabCount();
|
||
boolean found = false;
|
||
String text = (cObjInfo.getName()).toLowerCase() +"-pos";
|
||
String title = "";
|
||
|
||
boolean compressed = ((Boolean)iniObject.getParameter(XMLConstants.COMPRESSED)).booleanValue();
|
||
double time = ((Double)iniObject.getParameter(XMLConstants.JDAY)).doubleValue();
|
||
|
||
Point3f[] positions = objPos.getPositions(cObjInfo, time, compressed);
|
||
|
||
for(int i = 0; i < tabs; i++) {
|
||
title = jtp.getTitleAt(i);
|
||
if(title.equals(text)) {
|
||
found = true;
|
||
}
|
||
}
|
||
if(!found) {
|
||
jtp.insertTab(text, null, new PositionsPanel(cObjInfo ,positions), null, 0);
|
||
jtp.setSelectedIndex(0);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Removes a position tab from the main frame.
|
||
*
|
||
* @param CelstialObjectInfo to be removed information object
|
||
*/
|
||
public void removePosTab( CelestialObjectInfo cObjInfo ) {
|
||
int tabs = jtp.getTabCount();
|
||
int index = -1;
|
||
String id = (cObjInfo.getName()).toLowerCase() +"-pos";
|
||
String title = "";
|
||
|
||
for(int i = 0; i < tabs; i++) {
|
||
title = jtp.getTitleAt(i);
|
||
if(title.equals(id)) {
|
||
index = i;
|
||
}
|
||
}
|
||
if(index != -1) {
|
||
jtp.removeTabAt(index);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Adds the initialization tab to the main frame.
|
||
*/
|
||
public void addIniTab() {
|
||
int tabs = jtp.getTabCount();
|
||
boolean found = false;
|
||
String text = "initialization";
|
||
String title = "";
|
||
|
||
for(int i = 0; i < tabs; i++) {
|
||
title = jtp.getTitleAt(i);
|
||
if(title.equals(text)) {
|
||
found = true;
|
||
}
|
||
}
|
||
if(!found) {
|
||
jtp.insertTab(text, null, new InitializationPanel( objInfo,SSS3dConstants.RUNTIME_MODE ), null, 0);
|
||
jtp.setSelectedIndex(0);
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* Removes the initialization tab from the main frame.
|
||
*/
|
||
public void removeIniTab() {
|
||
int tabs = jtp.getTabCount();
|
||
int index = -1;
|
||
String title = "";
|
||
|
||
for(int i = 0; i < tabs; i++) {
|
||
title = jtp.getTitleAt(i);
|
||
if(title.equals("initialization")) {
|
||
index = i;
|
||
}
|
||
}
|
||
if(index != -1) {
|
||
jtp.removeTabAt(index);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Creates the menubar for the infobox.
|
||
*/
|
||
private JMenuBar createMenuBar() {
|
||
|
||
// MenuBar
|
||
JMenuBar menuBar = new JMenuBar();
|
||
JMenuItem mi;
|
||
JCheckBoxMenuItem cb;
|
||
|
||
// File Menu
|
||
JMenu file = (JMenu) menuBar.add(new JMenu("File"));
|
||
file.setMnemonic('F');
|
||
|
||
mi = (JMenuItem) file.add(new JMenuItem("Exit"));
|
||
mi.setMnemonic('x');
|
||
mi.addActionListener(new ActionCmdMenu());
|
||
|
||
// Animate Menu
|
||
JMenu animate = (JMenu) menuBar.add(new JMenu("Animate"));
|
||
animate.setMnemonic('A');
|
||
miGo = (JMenuItem) animate.add(new JMenuItem("Go"));
|
||
miGo.setMnemonic('G');
|
||
miGo.setEnabled(false);
|
||
miGo.addActionListener(new ActionCmdMenu());
|
||
miStop = (JMenuItem) animate.add(new JMenuItem("Stop all"));
|
||
miStop.setMnemonic('S');
|
||
miStop.setEnabled(true);
|
||
miStop.addActionListener(new ActionCmdMenu());
|
||
miRot = (JMenuItem) animate.add(new JMenuItem("Rotate only"));
|
||
miRot.setMnemonic('m');
|
||
miRot.setEnabled(true);
|
||
miRot.addActionListener(new ActionCmdMenu());
|
||
|
||
// View Menu
|
||
JMenu view = (JMenu) menuBar.add(new JMenu("View"));
|
||
view.setMnemonic('V');
|
||
mi = (JMenuItem) view.add(new JMenuItem("Init position"));
|
||
mi.setMnemonic('I');
|
||
mi.addActionListener(new ActionCmdMenu());
|
||
|
||
cb = (JCheckBoxMenuItem) view.add(new JCheckBoxMenuItem("Navigation"));
|
||
cb.setMnemonic('N');
|
||
cb.setSelected(false);
|
||
cb.addActionListener(new ActionCmdMenu());
|
||
|
||
cb = (JCheckBoxMenuItem) view.add(new JCheckBoxMenuItem("Initialization"));
|
||
cb.setMnemonic('Z');
|
||
cb.setSelected(false);
|
||
cb.addActionListener(new ActionCmdMenu());
|
||
|
||
cb = (JCheckBoxMenuItem) view.add(new JCheckBoxMenuItem("Background"));
|
||
cb.setMnemonic('B');
|
||
cb.setSelected(false);
|
||
cb.addActionListener(new ActionCmdMenu());
|
||
|
||
cb = (JCheckBoxMenuItem) view.add(new JCheckBoxMenuItem("Orbit"));
|
||
cb.setMnemonic('O');
|
||
cb.setSelected(true);
|
||
//cb.setEnabled(false);
|
||
cb.addActionListener(new ActionCmdMenu());
|
||
|
||
cb = (JCheckBoxMenuItem) view.add(new JCheckBoxMenuItem("Coordinate"));
|
||
cb.setMnemonic('C');
|
||
cb.setSelected(true);
|
||
//cb.setEnabled(false);
|
||
cb.addActionListener(new ActionCmdMenu());
|
||
|
||
// create menu view - object positions
|
||
mObjectsPos = new JMenu("Object Positions");
|
||
|
||
for(int i = 0; i < SSS3dConstants.MOON; i++) {
|
||
mObjectsPos.add(new MyJCheckBoxMenuItem(this,
|
||
mObjectsPos,
|
||
SSS3dConstants.CELESTIAL[i],
|
||
objInfo));
|
||
}
|
||
|
||
view.add(mObjectsPos);
|
||
|
||
// create menu view - object information
|
||
mObjectsInfo = new JMenu("Object Information");
|
||
|
||
for(int i = 0; i < SSS3dConstants.MOON; i++) {
|
||
mObjectsInfo.add(new MyJCheckBoxMenuItem(this,
|
||
mObjectsInfo,
|
||
SSS3dConstants.CELESTIAL[i],
|
||
objInfo));
|
||
}
|
||
|
||
view.add(mObjectsInfo);
|
||
|
||
// Help Menu
|
||
JMenu help = (JMenu) menuBar.add(new JMenu("Help"));
|
||
help.setMnemonic('H');
|
||
mi = (JMenuItem) help.add(new JMenuItem("About"));
|
||
mi.setMnemonic('A');
|
||
mi.addActionListener(new ActionCmdMenu());
|
||
|
||
return menuBar;
|
||
}
|
||
|
||
/**
|
||
* Window Listener for the InfoBox Frame.
|
||
*/
|
||
class WindowCmd extends WindowAdapter {
|
||
public void windowClosing(WindowEvent e) {
|
||
System.exit(0);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Class Action Listener for the file menu.
|
||
*/
|
||
class ActionCmdMenu implements ActionListener {
|
||
public void actionPerformed(ActionEvent e) {
|
||
String s = e.getActionCommand();
|
||
if(s.equals("Exit")) {
|
||
System.exit(0);
|
||
} else if(s.equals("Go")) {
|
||
miGo.setEnabled(false);
|
||
miStop.setEnabled(true);
|
||
miRot.setEnabled(true);
|
||
sss.lnkSceneSolarSystem.setAnimation(true, true);
|
||
if(sss.infoPanel != null) {
|
||
sss.infoPanel.startDate();
|
||
}
|
||
} else if(s.equals("Stop all")) {
|
||
miGo.setEnabled(true);
|
||
miStop.setEnabled(false);
|
||
miRot.setEnabled(false);
|
||
sss.lnkSceneSolarSystem.setAnimation(false, false);
|
||
if(sss.infoPanel != null) {
|
||
sss.infoPanel.stopDate();
|
||
}
|
||
} else if(s.equals("Rotate only")) {
|
||
miGo.setEnabled(true);
|
||
miStop.setEnabled(false);
|
||
miRot.setEnabled(false);
|
||
sss.lnkSceneSolarSystem.setAnimation(false, true);
|
||
if(sss.infoPanel != null) {
|
||
sss.infoPanel.stopDate();
|
||
}
|
||
} else if(s.equals("Init position")) {
|
||
sss.lnkViewBranch.setStartPosition();
|
||
} else if(s.equals("Background")) {
|
||
JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)e.getSource();
|
||
sss.lnkSceneSolarSystem.setBackground(cbmi.isSelected());
|
||
} else if(s.equals("Initialization")) {
|
||
JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)e.getSource();
|
||
if ( cbmi.isSelected() ) {
|
||
addIniTab();
|
||
} else {
|
||
removeIniTab();
|
||
}
|
||
} else if(s.equals("Navigation")) {
|
||
JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)e.getSource();
|
||
if ( cbmi.isSelected() ) {
|
||
sss.addNavigation();
|
||
} else {
|
||
sss.removeNavigation();
|
||
}
|
||
} else if(s.equals("Orbit")) {
|
||
JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)e.getSource();
|
||
sss.lnkSceneSolarSystem.setOrbit(cbmi.isSelected());
|
||
} else if(s.equals("Coordinate")) {
|
||
JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)e.getSource();
|
||
sss.lnkSceneSolarSystem.setCoordinate(cbmi.isSelected());
|
||
} else if(s.equals("About")) {
|
||
if(aboutBox == null) {
|
||
aboutBox = new JDialog(frame, "About the Solar System Simulator", true);
|
||
JPanel groupPanel = new JPanel(new BorderLayout());
|
||
ImageIcon groupPicture = new ImageIcon("images/sss.gif", "Solar System Simulator");
|
||
aboutBox.getContentPane().add(groupPanel, BorderLayout.CENTER);
|
||
JLabel groupLabel = (new JLabel(groupPicture));
|
||
groupPanel.add(groupLabel, BorderLayout.NORTH);
|
||
JPanel textPanel = new JPanel();
|
||
groupPanel.add(textPanel, BorderLayout.CENTER);
|
||
JTextArea textArea = (JTextArea) textPanel.add(new JTextArea(aboutText));
|
||
textArea.setEditable(false);
|
||
textArea.setFont(new Font("Courier", Font.PLAIN, 14));
|
||
textArea.setBackground(Color.lightGray);
|
||
JPanel buttonPanel = new JPanel();
|
||
groupPanel.add(buttonPanel, BorderLayout.SOUTH);
|
||
JButton button = (JButton) buttonPanel.add(new JButton("OK"));
|
||
button.addActionListener(new ActionListener() {
|
||
public void actionPerformed(ActionEvent e) {
|
||
aboutBox.setVisible(false);
|
||
}
|
||
});
|
||
}
|
||
aboutBox.pack();
|
||
aboutBox.setLocation((screenSize.width - aboutBox.getWidth()) / 2,
|
||
(screenSize.height - aboutBox.getHeight()) / 2);
|
||
aboutBox.show();
|
||
}
|
||
}
|
||
}
|
||
}
|