/**
* Title: GPS Simulator
* Copyright: Copyright (c) 2002
* Company: University of Oregon Computer Science Dept.
*
* @author Jason Prideaux
* @version 1.0
*
*/
package gui;
import gui.tray.*;
import controller.*;
import agent.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.util.*;
import java.io.*;
/* ====================================================================== */
/** This class is a frame for the Simulator. It contains a map which is the
* JComponent in which agents are added to and moved around. This frame
* also contains menu items, and is the parent for a Tray JDialog object.
*
*/
public class SimulatorFrame extends JFrame {
/** The controller which controls the simulation and this frame. */
private Controller controller;
/** The JComponent which is an image of a map. */
private ChartComp chart;
/** The scroll pane to put the ChartComp into. */
private ScrollPane pane;
/** A dialog for an about window. */
private JDialog aboutDialog;
/** A dialog for an exit confirmation. */
private JDialog quitDialog;
// Menu components.
private JMenuBar mnuBar = new JMenuBar();
private JMenu mnuFile = new JMenu();
private JMenu mnuEdit = new JMenu();
private JMenu mnuHelp = new JMenu();
private JMenuItem mnuItmAbout = new JMenuItem();
private JMenuItem mnuItmExit = new JMenuItem();
private JMenuItem mnuItmTray = new JMenuItem();
/* ===================================================================== */
/** This constructor initializes the frame by taking in the controller/owner
* of this frame, and the ChartComp to be added to this frame.
*
* @param controller The simulator controller.
* @param chart The map image panel to be displayed in frame.
*
*/
public SimulatorFrame(Controller controller, ChartComp chart){
super("iSIM");
this.chart = chart;
this.controller = controller;
// Initialize the components of this frame.
init();
// Close the JVM on exit.
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
} //Constructor
/* ===================================================================== */
/** This method sets up the components for the frame, the menus, and the
* CompChart to dispaly the map.
*
*/
public void init(){
// Create the menus
mnuFile.setMnemonic('F');
mnuFile.setText("File");
mnuFile.setMnemonic(KeyEvent.VK_F);
mnuItmExit.setMnemonic('X');
mnuItmExit.setText("Exit");
mnuItmExit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuItmExit_actionPerformed();
}
});
mnuEdit.setMnemonic('T');
mnuEdit.setText("Tray");
mnuItmTray.setMnemonic('S');
mnuItmTray.setText("Show Tray");
mnuItmTray.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuItmTray_actionPerformed(e);
}
});
mnuHelp.setMnemonic('H');
mnuHelp.setText("Help");
mnuItmAbout.setMnemonic('A');
mnuItmAbout.setText("About...");
mnuItmAbout.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuItmAbout_actionPerformed(e);
}
});
mnuBar.add(mnuFile);
mnuBar.add(mnuEdit);
mnuBar.add(mnuHelp);
mnuFile.add(mnuItmExit);
mnuEdit.add(mnuItmTray);
mnuHelp.add(mnuItmAbout);
// Create the panels
JPanel mainpanel = new JPanel(new BorderLayout());
JPanel chartpanel = new JPanel(new BorderLayout());
// Set Borders
mainpanel.setBorder(BorderFactory.createEmptyBorder( 10, 5, 5, 5));
chartpanel.setBorder(TTBorder.getBorder("Map"));
// Create scroll pane for map
pane = new ScrollPane();
pane.add(chart);
// Add stuff to panels
chartpanel.add(pane, BorderLayout.CENTER);
mainpanel.add(chartpanel, BorderLayout.CENTER);
// Add menu and mainpanel to this Frame
this.getContentPane().add(mnuBar, BorderLayout.NORTH);
this.getContentPane().add(mainpanel, BorderLayout.CENTER);
// Show it all and set the size
this.pack();
this.setSize(900,700);
//Set the location to be center
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = (screen.width - this.getWidth()) / 2;
int y = (screen.height - this.getHeight()) / 2;
this.setLocation(x,y);
//Now show this frame.
//this.setVisible(true);
} //method: init
// ========================================================================
/** This method is called to ask for exit confirmation.
*
*/
public void mnuItmExit_actionPerformed() {
//Setup a current/new JDialog.
quitDialog = new JDialog(this, "Exit Confirmation");
// Create buttons and the labels.
JLabel lbl = new JLabel("Are you sure you want to exit?");
JButton btnAdd = new JButton( " EXIT ");
JButton btnCancel = new JButton( "CANCEL");
JPanel btnpanel = new JPanel(new GridBagLayout());
JPanel lblpanel = new JPanel(new BorderLayout());
lblpanel.setBorder( BorderFactory.createEmptyBorder(15, 15, 15, 15) );
btnpanel.add(btnAdd, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST,
GridBagConstraints.NONE,
new Insets(2, 2, 2, 2), 0, 0));
btnpanel.add(btnCancel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST,
GridBagConstraints.HORIZONTAL,
new Insets(0, 10, 0, 0), 0, 0));
//Add components to the panels, then add panels to the JDialog.
lblpanel.add(lbl, BorderLayout.NORTH);
quitDialog.getContentPane().add(lblpanel, BorderLayout.CENTER);
quitDialog.getContentPane().add(btnpanel, BorderLayout.SOUTH);
//Make a button listener to close the dialog.
btnAdd.setMnemonic(KeyEvent.VK_A);
btnAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
btnCancel.setMnemonic(KeyEvent.VK_C);
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
quitDialog.dispose();
}
});
//Pack it all together
quitDialog.pack();
//Center this dialog on the screen.
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = ( screen.width / 2) - (quitDialog.getSize().width /2 );
int y = ( screen.height / 2) - (quitDialog.getSize().height /2 );
quitDialog.setLocation( x, y);
//Now show this dialog.
quitDialog.setVisible(true);
} //method: mnuItmExit_actionPerformed
/* ===================================================================== */
/** This method is the performs the action when the user selects About
* from this frame menu. A JDialog is built and shown on the screen.
*
* @param e The ActionEvent for the menu selection.
*
*/
public void mnuItmAbout_actionPerformed(ActionEvent e){
// Setup a the JDialog.
aboutDialog = new JDialog(this, "About");
// Create a button and the labels.
JLabel lbl = new JLabel();
JButton btn = new JButton( " CLOSE ");
// Set the texxt to display
lbl.setText(""
+ "GPS & WiFi Simulator version " + 1.1 + " build " + 5
+ "
Copyright (C) 2002."
+ "Author:
"
+ ""
+ "Jason Prideaux
"
+ "
"
+ ""
);
// Create panels for hold the Components
JPanel btnpanel = new JPanel();
JPanel lblpanel = new JPanel(new BorderLayout());
// Set borders
lblpanel.setBorder( BorderFactory.createEmptyBorder(20, 20, 20, 20) );
// Add components to the panels, then add panels to the JDialog.
lblpanel.add(lbl, BorderLayout.NORTH);
btnpanel.add(btn);
// Add panels to the dialog
aboutDialog.getContentPane().add(lblpanel, BorderLayout.CENTER);
aboutDialog.getContentPane().add(btnpanel, BorderLayout.SOUTH);
// Make a button listener to close the dialog.
btn.setMnemonic(KeyEvent.VK_C);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aboutDialog.dispose();
}
});
// Pack it all together
aboutDialog.pack();
// Center this dialog on the screen.
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = ( screen.width / 2) - (aboutDialog.getSize().width /2 );
int y = ( screen.height / 2) - (aboutDialog.getSize().height /2 );
aboutDialog.setLocation( x, y);
// Now show this dialog.
aboutDialog.setVisible(true);
} //method: mnuItmAbout_actionPerformed
/* ===================================================================== */
/** This method is the performs the action when the user selects Tray
* from this frame menu. It first checks to see if the Tray is alrady
* visible in the interface, and if not it creates a new Tray, by informing
* Controller.
*
* @param e The ActionEvent for the menu selection.
*
*/
public void mnuItmTray_actionPerformed(ActionEvent e){
// Check if exists already.
if( !(controller.isTrayAlive()) ){
controller.makeTray();
}
} //method: mnuItmTray_actionPerformed
/* ===================================================================== */
/** This method take the given Point and changes the scroll position of
* the ScrollPane inorder to make the given Point the center of the view.
*
* @param pos The Point to be the new center of displayed chart.
*
*/
public void centerScreen(Point pos){
Point p = pane.getScrollPosition();
Dimension d = pane.getViewportSize();
Point p2=new Point(p);
p2.y=pos.y-(d.height)/2;
p2.x=pos.x-(d.width)/2;
if (!p2.equals(p)){
pane.setScrollPosition(p2);
}
} //method: centerScreen
/* ===================================================================== */
/** This method changes the map image/data which the ChartComp is currently
* displaying. The method mearly checks that the map data file exists, then
* call on ChartComp.
*
* @param chartName The chart filename to put into the ChartComp.
* @param scale The scale of the map image.
* @param precision The precision of the map image for the ChartComp
*
*/
public void changeChart(String chartName){
if (!(new File("files/data/"+chartName)).exists()){
System.err.println("Could not find file: "+chartName);
}
chart.loadChart(chartName);
this.show();
} //method: changeChart
/* ===================================================================== */
/** This method returns the ScrollPane kept inside this frame. The main
* purpose is for the controller to get position information from it.
*
* @return ScrollPane The main scrollPane inside this frame.
*
*/
public ScrollPane getChartPane(){
return pane;
} //method: getChartPane
} //class: SimulatorFrame