/*
 * sceneApp.java
 * Created on March 14, 2003, 8:10 PM
 */

/* Massive Includes */
import java.awt.*;
import java.lang.Math;
import java.awt.event.*;
import java.applet.*;
import java.applet.Applet;
import java.io.*;
import java.net.*;
import java.util.*;
import java.beans.*;
import java.awt.image.*;

/* Swing includes */
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.border.*;
import javax.swing.colorchooser.*;
import javax.swing.filechooser.*;
import javax.accessibility.*;
import javax.swing.SwingUtilities.*;

/**
 *
 * This application creates scenarios for project 
 * Strike Force: Scenario Planner
 * @author  Nicholas Cole (@link mailto:ncole@cs.unr.edu)
 */
public class sceneApp extends JApplet {
    
    /* Controls cursor blinking */
    public final static int ONE_SECOND = 1000;
    private int cursorAlpha = 100;
    private boolean goUp = true;
    
    /* Controls debug mode */
    private boolean DEBUG = false;

    /* Our heavy sub-classes */
    private StrikeMap targetMap = null;
    public sceneBuilder buildScene;
    private mapDisplayer canvasMap;
    private Image image;                                    //our map 768x549
      
    private boolean displayScene = false;
    
    //possible modes the GUI can run in
    private int randomGen = 1;
    private int humanGen = 2;
    private int gaGen = 3;
    
    private int currentStrat = randomGen;           //this decides what mode
                                                    //we're in.
    /* Option Parameters*/
    private boolean checkForWater = true;
    private int numTargets = 3;                    //num of targets (Default)
    private int numRadars = 2;                    //num of radars (default)
    private double coverageEps = 300.0;
    private double initRadius = 100.0;             //initial radar radius
    private double maxRadius = 250.0;              //initial max
    private double initialStr = 1.0;
    
    private int selectedTarget = -1;               //indicates which object
    private int selectedRadar = -1;                //is selected
    
    /* Cut and paste vars */
    private Target cutTarget = null;               //the radar/target
    private Radar cutRadar = null;                 //on the clipboard
    
    /* Routing vars */
    private LinkedList waypointsL = new LinkedList();    //waypoints for route
    private boolean drawRoute = false;
   
    /* The carrier */
    private ScreenLoc carrier = new ScreenLoc( 200, 450 );
    
    /*GA options */
    private int mobileThreatCount = 5;              //ga optimized threats
    private int gaPop = 200;
    private int gaGenCount = 50;
    private int gaMode = 0;                             //0-total control, 1-alg
    private int gaThreatRad = 100;                      //the size of the radar
    private int gaBlinkCount = 0;
    
    private LinkedList threats = new LinkedList();
    private boolean drawGA = false;
    
    private RouterThread routerThread = null;
    
    /** Creates new form sceneApp */
    public sceneApp(){
    }
    
    //Applet init method
    public void init() {
        
        //Initialize the GUI Components       
        initComponents();
        
        //Init the canvas
        initCanvas();      
        Edit.setEnabled( false );
        Object.setEnabled( false );
        objectProp.setEnabled( false );
        deleteTargetMenu.setEnabled( false );
        deleteRadarMenu.setEnabled( false );
        paste.setEnabled( false );
        GA.setEnabled( false );
        Route.setEnabled( false );
        buildScene = new sceneBuilder(targetMap);
        
        timer.start();
    }
    
    /**This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        aboutBox = new javax.swing.JDialog();
        aboutTabPane = new javax.swing.JTabbedPane();
        targetOptions = new javax.swing.JDialog();
        optionsTabPane = new javax.swing.JTabbedPane();
        modePanel = new javax.swing.JPanel();
        randomModeRadio = new javax.swing.JRadioButton();
        humanModeRadio = new javax.swing.JRadioButton();
        gaModeRadio = new javax.swing.JRadioButton();
        randomPanel = new javax.swing.JPanel();
        targetCountText = new javax.swing.JTextField();
        targetCountLabel = new javax.swing.JLabel();
        radarCountLabel = new javax.swing.JLabel();
        radarCountText = new javax.swing.JTextField();
        waterCheckBox = new javax.swing.JCheckBox();
        coverageSlider = new javax.swing.JSlider();
        radarCoverageLabel = new javax.swing.JLabel();
        minLabel = new javax.swing.JLabel();
        maxLabel = new javax.swing.JLabel();
        radarPanel = new javax.swing.JPanel();
        radarRadText = new javax.swing.JTextField();
        radarInitLabel = new javax.swing.JLabel();
        radarMaxLabel = new javax.swing.JLabel();
        radarMaxRadText = new javax.swing.JTextField();
        radarStrLabel = new javax.swing.JLabel();
        radarStrSlider = new javax.swing.JSlider();
        radarStrWeakLabel = new javax.swing.JLabel();
        radarStrStrongLabel = new javax.swing.JLabel();
        gaOptionsPanel = new javax.swing.JPanel();
        mobileThreatsLabel = new javax.swing.JLabel();
        mobileThreatsText = new javax.swing.JTextField();
        gaLocModeRadio = new javax.swing.JRadioButton();
        gaAlgModeRadio = new javax.swing.JRadioButton();
        gaModeLabel = new javax.swing.JLabel();
        gaPopLabel = new javax.swing.JLabel();
        gaPopText = new javax.swing.JTextField();
        gaGenLabel = new javax.swing.JLabel();
        gaGenText = new javax.swing.JTextField();
        gaThreatRadLabel = new javax.swing.JLabel();
        gaThreatRadText = new javax.swing.JTextField();
        okButton = new javax.swing.JButton();
        cancelButton = new javax.swing.JButton();
        modeButtonGroup = new javax.swing.ButtonGroup();
        editTarDialog = new javax.swing.JDialog();
        editTarPanel = new javax.swing.JPanel();
        okButtonEditTar = new javax.swing.JButton();
        cancelButtonEditTar = new javax.swing.JButton();
        editTarTitleLabel = new javax.swing.JLabel();
        editTarLatLabel = new javax.swing.JLabel();
        editTarLatText = new javax.swing.JTextField();
        editTarLongLabel = new javax.swing.JLabel();
        editTarLongText = new javax.swing.JTextField();
        editTarDescLabel = new javax.swing.JLabel();
        editTarDescText = new javax.swing.JTextField();
        editTarImporLabel = new javax.swing.JLabel();
        editTarImporText = new javax.swing.JTextField();
        editTarTargetIDLabel = new javax.swing.JLabel();
        editTarIDEdit = new javax.swing.JLabel();
        editRadDialog = new javax.swing.JDialog();
        editRadTitleLabel = new javax.swing.JLabel();
        editRadLatLabel = new javax.swing.JLabel();
        editRadLongLabel = new javax.swing.JLabel();
        editRadIDLabel = new javax.swing.JLabel();
        editRadIDEdit = new javax.swing.JLabel();
        editRadLatText = new javax.swing.JTextField();
        editRadLongText = new javax.swing.JTextField();
        editRadImporLabel = new javax.swing.JLabel();
        editRadImporText = new javax.swing.JTextField();
        editRadDescLabel = new javax.swing.JLabel();
        editRadDescText = new javax.swing.JTextField();
        cancelButtonEditRad = new javax.swing.JButton();
        okButtonEditRad = new javax.swing.JButton();
        editRadMaxRadLabel = new javax.swing.JLabel();
        editRadRadLabel = new javax.swing.JLabel();
        editRadRadText = new javax.swing.JTextField();
        editRadMaxRadText = new javax.swing.JTextField();
        editRadStrLabel = new javax.swing.JLabel();
        editRadStrSlider = new javax.swing.JSlider();
        editRadWeakStrLabel = new javax.swing.JLabel();
        editRadStrongLabel = new javax.swing.JLabel();
        gaButtonGroup = new javax.swing.ButtonGroup();
        mainTab = new javax.swing.JTabbedPane();
        Map = new javax.swing.JInternalFrame();
        topMenu = new javax.swing.JMenuBar();
        File = new javax.swing.JMenu();
        newScene = new javax.swing.JMenuItem();
        Edit = new javax.swing.JMenu();
        copy = new javax.swing.JMenuItem();
        cut = new javax.swing.JMenuItem();
        paste = new javax.swing.JMenuItem();
        Object = new javax.swing.JMenu();
        objectProp = new javax.swing.JMenuItem();
        objectMenuSep = new javax.swing.JSeparator();
        newRadarMenu = new javax.swing.JMenuItem();
        deleteRadarMenu = new javax.swing.JMenuItem();
        deleteSep = new javax.swing.JSeparator();
        newTargetMenu = new javax.swing.JMenuItem();
        deleteTargetMenu = new javax.swing.JMenuItem();
        GA = new javax.swing.JMenu();
        gaStartMenu = new javax.swing.JMenuItem();
        Route = new javax.swing.JMenu();
        showRouteMenu = new javax.swing.JMenuItem();
        clearRouteMenu = new javax.swing.JMenuItem();
        Options = new javax.swing.JMenu();
        editOptions = new javax.swing.JMenuItem();
        Help = new javax.swing.JMenu();
        showAbout = new javax.swing.JMenuItem();

        aboutBox.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowDeactivated(java.awt.event.WindowEvent evt) {
                aboutDeactivated(evt);
            }
        });

        aboutBox.getContentPane().add(aboutTabPane, java.awt.BorderLayout.CENTER);

        targetOptions.getContentPane().setLayout(null);

        optionsTabPane.setToolTipText("");
        modePanel.setLayout(null);

        modePanel.setToolTipText("Changes generation mode");
        randomModeRadio.setText("Random Generation");
        randomModeRadio.setToolTipText("Generates randomly placed targets and radars");
        modeButtonGroup.add(randomModeRadio);
        modePanel.add(randomModeRadio);
        randomModeRadio.setBounds(20, 20, 140, 24);

        humanModeRadio.setText("Human Editable");
        humanModeRadio.setToolTipText("Enable this to allow editing of radars and targets");
        modeButtonGroup.add(humanModeRadio);
        modePanel.add(humanModeRadio);
        humanModeRadio.setBounds(20, 60, 140, 24);

        gaModeRadio.setText("GA Optimized");
        gaModeRadio.setToolTipText("Select this mode to optimize enable the running of the GA to optimize mobile threat placement");
        modeButtonGroup.add(gaModeRadio);
        modePanel.add(gaModeRadio);
        gaModeRadio.setBounds(20, 100, 150, 24);

        optionsTabPane.addTab("Mode", modePanel);

        randomPanel.setLayout(null);

        randomPanel.setToolTipText("Change random mode generation parameters");
        targetCountText.setText("targetCountText");
        targetCountText.setToolTipText("Enter new number of targets");
        randomPanel.add(targetCountText);
        targetCountText.setBounds(130, 20, 40, 20);

        targetCountLabel.setText("Number of Targets:");
        targetCountLabel.setToolTipText("Current target count");
        randomPanel.add(targetCountLabel);
        targetCountLabel.setBounds(10, 20, 109, 16);

        radarCountLabel.setText("Number of Radars:");
        radarCountLabel.setToolTipText("Current number of radars");
        randomPanel.add(radarCountLabel);
        radarCountLabel.setBounds(10, 50, 106, 16);

        radarCountText.setText("jTextField1");
        radarCountText.setToolTipText("Enter new number of radars");
        randomPanel.add(radarCountText);
        radarCountText.setBounds(130, 50, 40, 20);

        waterCheckBox.setText("Check for Water");
        waterCheckBox.setToolTipText("Check this to keep targets on land");
        randomPanel.add(waterCheckBox);
        waterCheckBox.setBounds(10, 170, 120, 24);

        coverageSlider.setMaximum(300);
        coverageSlider.setToolTipText("Adjust to set radar coverage");
        randomPanel.add(coverageSlider);
        coverageSlider.setBounds(10, 110, 200, 16);

        radarCoverageLabel.setText("Radar Coverage:");
        radarCoverageLabel.setToolTipText("This determines how closely a target will fall under radars");
        randomPanel.add(radarCoverageLabel);
        radarCoverageLabel.setBounds(10, 90, 100, 16);

        minLabel.setText("Min");
        randomPanel.add(minLabel);
        minLabel.setBounds(10, 130, 30, 16);

        maxLabel.setText("Max");
        randomPanel.add(maxLabel);
        maxLabel.setBounds(190, 130, 30, 16);

        optionsTabPane.addTab("Random", randomPanel);

        radarPanel.setLayout(null);

        radarRadText.setText("jTextField1");
        radarRadText.setToolTipText("Input a floating point number for the initial radius");
        radarPanel.add(radarRadText);
        radarRadText.setBounds(130, 30, 40, 20);

        radarInitLabel.setText("Radar Initial Radius:");
        radarInitLabel.setToolTipText("Default radar radius");
        radarPanel.add(radarInitLabel);
        radarInitLabel.setBounds(10, 30, 120, 16);

        radarMaxLabel.setText("Radar Max Radius:");
        radarMaxLabel.setToolTipText("Maximum Radar Radius");
        radarPanel.add(radarMaxLabel);
        radarMaxLabel.setBounds(10, 60, 110, 16);

        radarMaxRadText.setText("jTextField1");
        radarMaxRadText.setToolTipText("Input a floating point number for the max radius");
        radarPanel.add(radarMaxRadText);
        radarMaxRadText.setBounds(130, 60, 40, 20);

        radarStrLabel.setText("Initial Strength:");
        radarPanel.add(radarStrLabel);
        radarStrLabel.setBounds(10, 100, 90, 16);

        radarStrSlider.setMaximum(500);
        radarStrSlider.setMinimum(100);
        radarStrSlider.setToolTipText("Determines how much danger a threat creates");
        radarPanel.add(radarStrSlider);
        radarStrSlider.setBounds(40, 120, 200, 16);

        radarStrWeakLabel.setText("Hurt Me Plenty");
        radarPanel.add(radarStrWeakLabel);
        radarStrWeakLabel.setBounds(10, 140, 90, 16);

        radarStrStrongLabel.setText("Nightmare");
        radarPanel.add(radarStrStrongLabel);
        radarStrStrongLabel.setBounds(200, 140, 60, 16);

        optionsTabPane.addTab("Radar", null, radarPanel, "Change radar settings");

        gaOptionsPanel.setLayout(null);

        gaOptionsPanel.setToolTipText("Set GA Options");
        mobileThreatsLabel.setText("Mobile Threats:");
        gaOptionsPanel.add(mobileThreatsLabel);
        mobileThreatsLabel.setBounds(20, 20, 90, 16);

        mobileThreatsText.setText("jTextField1");
        mobileThreatsText.setToolTipText("This is the number of radars the GA must place");
        gaOptionsPanel.add(mobileThreatsText);
        mobileThreatsText.setBounds(120, 20, 40, 20);

        gaLocModeRadio.setText("Location");
        gaLocModeRadio.setToolTipText("This mode gives the GA total control of mobile threat placement");
        gaButtonGroup.add(gaLocModeRadio);
        gaOptionsPanel.add(gaLocModeRadio);
        gaLocModeRadio.setBounds(80, 50, 80, 24);

        gaAlgModeRadio.setText("Algorithm");
        gaAlgModeRadio.setToolTipText("This mode allows the GA to choose from a set of rules to help determine optimal placement");
        gaButtonGroup.add(gaAlgModeRadio);
        gaOptionsPanel.add(gaAlgModeRadio);
        gaAlgModeRadio.setBounds(170, 50, 80, 24);

        gaModeLabel.setText("GA Mode:");
        gaOptionsPanel.add(gaModeLabel);
        gaModeLabel.setBounds(20, 50, 60, 16);

        gaPopLabel.setText("Population:");
        gaOptionsPanel.add(gaPopLabel);
        gaPopLabel.setBounds(20, 90, 70, 16);

        gaPopText.setText("jTextField1");
        gaPopText.setToolTipText("The number of individuals in a population");
        gaOptionsPanel.add(gaPopText);
        gaPopText.setBounds(100, 90, 63, 20);

        gaGenLabel.setText("Generations:");
        gaOptionsPanel.add(gaGenLabel);
        gaGenLabel.setBounds(20, 120, 80, 16);

        gaGenText.setText("jTextField1");
        gaGenText.setToolTipText("The number of generations the GA will run");
        gaOptionsPanel.add(gaGenText);
        gaGenText.setBounds(100, 120, 63, 20);

        gaThreatRadLabel.setText("Threat Radius:");
        gaOptionsPanel.add(gaThreatRadLabel);
        gaThreatRadLabel.setBounds(20, 150, 90, 16);

        gaThreatRadText.setText("jTextField1");
        gaThreatRadText.setToolTipText("This determines how large the radius of a GA threat will be");
        gaOptionsPanel.add(gaThreatRadText);
        gaThreatRadText.setBounds(110, 150, 63, 20);

        optionsTabPane.addTab("GA", null, gaOptionsPanel, "Controls GA options");

        targetOptions.getContentPane().add(optionsTabPane);
        optionsTabPane.setBounds(0, 0, 319, 240);

        okButton.setText("OK");
        okButton.setToolTipText("Close this window and save options");
        okButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                optionsOKAction(evt);
            }
        });

        targetOptions.getContentPane().add(okButton);
        okButton.setBounds(250, 240, 70, 26);

        cancelButton.setText("Cancel");
        cancelButton.setToolTipText("Close this window and forget options");
        cancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                optionsCancelAction(evt);
            }
        });

        targetOptions.getContentPane().add(cancelButton);
        cancelButton.setBounds(180, 240, 73, 26);

        editTarDialog.getContentPane().setLayout(null);

        editTarPanel.setLayout(null);

        okButtonEditTar.setText("OK");
        okButtonEditTar.setToolTipText("Close this window and save options");
        okButtonEditTar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editTarOKAction(evt);
            }
        });

        editTarPanel.add(okButtonEditTar);
        okButtonEditTar.setBounds(250, 240, 70, 26);

        cancelButtonEditTar.setText("Cancel");
        cancelButtonEditTar.setToolTipText("Close this window and forget options");
        cancelButtonEditTar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editTarCancelAction(evt);
            }
        });

        editTarPanel.add(cancelButtonEditTar);
        cancelButtonEditTar.setBounds(180, 240, 73, 26);

        editTarTitleLabel.setText("Edit Target Properties");
        editTarPanel.add(editTarTitleLabel);
        editTarTitleLabel.setBounds(100, 10, 130, 16);

        editTarLatLabel.setText("Target Latitude:");
        editTarPanel.add(editTarLatLabel);
        editTarLatLabel.setBounds(10, 90, 100, 16);

        editTarLatText.setText("jTextField1");
        editTarLatText.setToolTipText("Enter a latitude");
        editTarPanel.add(editTarLatText);
        editTarLatText.setBounds(120, 90, 130, 20);

        editTarLongLabel.setText("Target Longitude:");
        editTarPanel.add(editTarLongLabel);
        editTarLongLabel.setBounds(10, 120, 110, 16);

        editTarLongText.setText("jTextField1");
        editTarLongText.setToolTipText("Enter a longitude");
        editTarPanel.add(editTarLongText);
        editTarLongText.setBounds(120, 120, 130, 20);

        editTarDescLabel.setText("Description:");
        editTarPanel.add(editTarDescLabel);
        editTarDescLabel.setBounds(10, 210, 80, 16);

        editTarDescText.setText("jTextField1");
        editTarDescText.setToolTipText("Enter a text description of the target");
        editTarPanel.add(editTarDescText);
        editTarDescText.setBounds(80, 210, 220, 20);

        editTarImporLabel.setText("Importance:");
        editTarPanel.add(editTarImporLabel);
        editTarImporLabel.setBounds(10, 160, 100, 16);

        editTarImporText.setText("jTextField1");
        editTarImporText.setToolTipText("This represents the target's value");
        editTarPanel.add(editTarImporText);
        editTarImporText.setBounds(120, 160, 50, 20);

        editTarTargetIDLabel.setText("Target ID:");
        editTarPanel.add(editTarTargetIDLabel);
        editTarTargetIDLabel.setBounds(10, 50, 60, 16);

        editTarIDEdit.setText("jLabel1");
        editTarIDEdit.setToolTipText("Target's ID");
        editTarPanel.add(editTarIDEdit);
        editTarIDEdit.setBounds(80, 50, 41, 16);

        editTarDialog.getContentPane().add(editTarPanel);
        editTarPanel.setBounds(0, 0, 320, 270);

        editRadDialog.getContentPane().setLayout(null);

        editRadTitleLabel.setText("Edit Radar Properties");
        editRadDialog.getContentPane().add(editRadTitleLabel);
        editRadTitleLabel.setBounds(100, 10, 140, 16);

        editRadLatLabel.setText("Radar Latitude:");
        editRadDialog.getContentPane().add(editRadLatLabel);
        editRadLatLabel.setBounds(10, 90, 90, 16);

        editRadLongLabel.setText("Radar Longitude:");
        editRadDialog.getContentPane().add(editRadLongLabel);
        editRadLongLabel.setBounds(10, 120, 100, 16);

        editRadIDLabel.setText("Radar ID:");
        editRadDialog.getContentPane().add(editRadIDLabel);
        editRadIDLabel.setBounds(10, 50, 60, 16);

        editRadIDEdit.setText("jLabel2");
        editRadDialog.getContentPane().add(editRadIDEdit);
        editRadIDEdit.setBounds(70, 50, 41, 16);

        editRadLatText.setText("jTextField1");
        editRadDialog.getContentPane().add(editRadLatText);
        editRadLatText.setBounds(120, 90, 130, 20);

        editRadLongText.setText("jTextField1");
        editRadDialog.getContentPane().add(editRadLongText);
        editRadLongText.setBounds(120, 120, 130, 20);

        editRadImporLabel.setText("Importance:");
        editRadDialog.getContentPane().add(editRadImporLabel);
        editRadImporLabel.setBounds(10, 160, 80, 16);

        editRadImporText.setText("jTextField1");
        editRadImporText.setToolTipText("This indicates the importance of the radar to the defender");
        editRadDialog.getContentPane().add(editRadImporText);
        editRadImporText.setBounds(120, 160, 63, 20);

        editRadDescLabel.setText("Description:");
        editRadDialog.getContentPane().add(editRadDescLabel);
        editRadDescLabel.setBounds(10, 200, 70, 16);

        editRadDescText.setText("jTextField1");
        editRadDescText.setToolTipText("Description of the radar");
        editRadDialog.getContentPane().add(editRadDescText);
        editRadDescText.setBounds(80, 200, 220, 20);

        cancelButtonEditRad.setText("Cancel");
        cancelButtonEditRad.setToolTipText("Close this window and forget options");
        cancelButtonEditRad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelButtonEditRadActionPerformed(evt);
            }
        });

        editRadDialog.getContentPane().add(cancelButtonEditRad);
        cancelButtonEditRad.setBounds(180, 370, 73, 26);

        okButtonEditRad.setText("OK");
        okButtonEditRad.setToolTipText("Close this window and save options");
        okButtonEditRad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                okButtonEditRadActionPerformed(evt);
            }
        });

        editRadDialog.getContentPane().add(okButtonEditRad);
        okButtonEditRad.setBounds(250, 370, 70, 26);

        editRadMaxRadLabel.setText("Radar Max Radius:");
        editRadDialog.getContentPane().add(editRadMaxRadLabel);
        editRadMaxRadLabel.setBounds(10, 260, 110, 16);

        editRadRadLabel.setText("Radar Radius:");
        editRadDialog.getContentPane().add(editRadRadLabel);
        editRadRadLabel.setBounds(10, 230, 90, 16);

        editRadRadText.setText("jTextField1");
        editRadRadText.setToolTipText("Current radius");
        editRadDialog.getContentPane().add(editRadRadText);
        editRadRadText.setBounds(120, 230, 130, 20);

        editRadMaxRadText.setText("jTextField1");
        editRadMaxRadText.setToolTipText("Maximum Radius");
        editRadDialog.getContentPane().add(editRadMaxRadText);
        editRadMaxRadText.setBounds(120, 260, 130, 20);

        editRadStrLabel.setText("Strength: ");
        editRadDialog.getContentPane().add(editRadStrLabel);
        editRadStrLabel.setBounds(10, 290, 80, 16);

        editRadStrSlider.setMinimum(50);
        editRadStrSlider.setToolTipText("This is the amount of danger this radar exerts");
        editRadDialog.getContentPane().add(editRadStrSlider);
        editRadStrSlider.setBounds(40, 310, 200, 16);

        editRadWeakStrLabel.setText("Hurt Me Plenty");
        editRadWeakStrLabel.setToolTipText("Weak");
        editRadDialog.getContentPane().add(editRadWeakStrLabel);
        editRadWeakStrLabel.setBounds(10, 330, 90, 16);

        editRadStrongLabel.setText("Nightmare");
        editRadStrongLabel.setToolTipText("Killer");
        editRadDialog.getContentPane().add(editRadStrongLabel);
        editRadStrongLabel.setBounds(200, 330, 60, 16);

        mainTab.setBorder(new javax.swing.border.MatteBorder(null));
        mainTab.setName("null\n");
        Map.setTitle("California");
        Map.setFrameIcon(null);
        Map.setPreferredSize(new java.awt.Dimension(640, 480));
        try {
            Map.setSelected(true);
        } catch (java.beans.PropertyVetoException e1) {
            e1.printStackTrace();
        }
        mainTab.addTab("Map View", Map);

        getContentPane().add(mainTab, java.awt.BorderLayout.CENTER);

        File.setText("Scene");
        newScene.setText("New Scenario");
        newScene.setToolTipText("Build a new scenario based on the current mode");
        newScene.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newAction(evt);
            }
        });

        File.add(newScene);

        topMenu.add(File);

        Edit.setText("Edit");
        Edit.setToolTipText("Change to Human Editable mode to enable this menu");
        copy.setText("Copy");
        copy.setToolTipText("Copy an object");
        copy.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                copyActionPerformed(evt);
            }
        });

        Edit.add(copy);

        cut.setText("Cut");
        cut.setToolTipText("Cut an object");
        cut.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cutActionPerformed(evt);
            }
        });

        Edit.add(cut);

        paste.setText("Paste");
        paste.setToolTipText("Paste an object");
        paste.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pasteActionPerformed(evt);
            }
        });

        Edit.add(paste);

        topMenu.add(Edit);

        Object.setText("Object");
        Object.setToolTipText("Change mode to Human Editable to enable this menu");
        objectProp.setText("Properties");
        objectProp.setToolTipText("View properties of a radar or target");
        objectProp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                objectPropActionPerformed(evt);
            }
        });

        Object.add(objectProp);

        Object.add(objectMenuSep);

        newRadarMenu.setText("New Radar");
        newRadarMenu.setToolTipText("Create a new radar");
        newRadarMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newRadarMenuActionPerformed(evt);
            }
        });

        Object.add(newRadarMenu);

        deleteRadarMenu.setText("Delete Radar");
        deleteRadarMenu.setToolTipText("Delete the selected radar from the scene");
        deleteRadarMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteRadarMenuActionPerformed(evt);
            }
        });

        Object.add(deleteRadarMenu);

        Object.add(deleteSep);

        newTargetMenu.setText("New Target");
        newTargetMenu.setToolTipText("Create a new target on the map");
        newTargetMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newTargetMenuActionPerformed(evt);
            }
        });

        Object.add(newTargetMenu);

        deleteTargetMenu.setText("Delete Target");
        deleteTargetMenu.setToolTipText("Delete the selected target from the scene");
        deleteTargetMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteTargetMenuActionPerformed(evt);
            }
        });

        Object.add(deleteTargetMenu);

        topMenu.add(Object);

        GA.setText("GA");
        gaStartMenu.setText("Start");
        gaStartMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gaStartMenuActionPerformed(evt);
            }
        });

        GA.add(gaStartMenu);

        topMenu.add(GA);

        Route.setText("Route");
        showRouteMenu.setText("Show");
        showRouteMenu.setToolTipText("Creates a route from carrier to threat");
        showRouteMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                showRouteMenuActionPerformed(evt);
            }
        });

        Route.add(showRouteMenu);

        clearRouteMenu.setText("Clear");
        clearRouteMenu.setToolTipText("Clears route");
        clearRouteMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                clearRouteMenuActionPerformed(evt);
            }
        });

        Route.add(clearRouteMenu);

        topMenu.add(Route);

        Options.setText("Options");
        editOptions.setText("Edit Options");
        editOptions.setToolTipText("Change options");
        editOptions.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editOptionsAction(evt);
            }
        });

        Options.add(editOptions);

        topMenu.add(Options);

        Help.setText("Help");
        Help.setToolTipText("Help using this Applet");
        Help.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                aboutAction(evt);
            }
        });

        showAbout.setText("About");
        showAbout.setToolTipText("Info about the authors");
        showAbout.addMenuDragMouseListener(new javax.swing.event.MenuDragMouseListener() {
            public void menuDragMouseEntered(javax.swing.event.MenuDragMouseEvent evt) {
            }
            public void menuDragMouseExited(javax.swing.event.MenuDragMouseEvent evt) {
            }
            public void menuDragMouseDragged(javax.swing.event.MenuDragMouseEvent evt) {
            }
            public void menuDragMouseReleased(javax.swing.event.MenuDragMouseEvent evt) {
                showAbout(evt);
            }
        });

        showAbout.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                showAboutBox(evt);
            }
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                showAboutBox(evt);
            }
        });

        Help.add(showAbout);

        topMenu.add(Help);

        setJMenuBar(topMenu);

    }//GEN-END:initComponents

    private void clearRouteMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearRouteMenuActionPerformed
        clearRouteMenu.setEnabled( false );
        drawRoute = false;
        waypointsL.clear();
    }//GEN-LAST:event_clearRouteMenuActionPerformed

    private void showRouteMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showRouteMenuActionPerformed
        int i;
        waypointsL.clear();         //clear old points
        routerThread = new RouterThread();
      
    
    }//GEN-LAST:event_showRouteMenuActionPerformed

    private void gaStartMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gaStartMenuActionPerformed
        startGA();
    }//GEN-LAST:event_gaStartMenuActionPerformed

    private void pasteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pasteActionPerformed
        if( cutTarget != null ){
            buildScene.addTarget(cutTarget );
            cutTarget = null;
        }else if( cutRadar != null ){
            buildScene.addRadar( cutRadar );
            cutRadar = null;
        }
    }//GEN-LAST:event_pasteActionPerformed

    private void deleteRadarMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteRadarMenuActionPerformed
        buildScene.removeRadar( selectedRadar );
        selectedRadar = -1;
        deleteRadarMenu.setEnabled( false );       
    }//GEN-LAST:event_deleteRadarMenuActionPerformed

    private void deleteTargetMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteTargetMenuActionPerformed
        buildScene.removeTarget( selectedTarget );
        selectedTarget = -1;
        deleteTargetMenu.setEnabled( false );
        if( buildScene.targetCount <= 0 ){
            GA.setEnabled( false );
        }           
    }//GEN-LAST:event_deleteTargetMenuActionPerformed

    private void cutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cutActionPerformed
        if( selectedTarget != -1 ){
            cutRadar = null;
            cutTarget = buildScene.targetArray[selectedTarget];
            buildScene.removeTarget(selectedTarget);
        }else if( selectedRadar != -1 ){
            cutTarget = null;
            cutRadar = buildScene.radarArray[selectedRadar];
            buildScene.removeRadar(selectedRadar);
        }
        paste.setEnabled(true);
    }//GEN-LAST:event_cutActionPerformed

    private void copyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyActionPerformed
        if( selectedTarget != -1 ){
            cutRadar = null;
            cutTarget = buildScene.targetArray[selectedTarget];
        }else if( selectedRadar != -1 ){
            cutTarget = null;
            cutRadar = buildScene.radarArray[selectedRadar];
        }
        paste.setEnabled(true);
    }//GEN-LAST:event_copyActionPerformed

    private void newRadarMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRadarMenuActionPerformed
        LatLong tempLL = new LatLong(38.5, 121.5);
        
        //create a temp
        Radar tempRadar = new Radar( "Basic Radar", tempLL,
            "0", buildScene.targetMap, 100.0, initRadius, maxRadius,
            initialStr  );
        
        //add the temp to the scene
        buildScene.addRadar( tempRadar );
        selectedRadar = buildScene.radarCount - 1;
        selectedTarget = -1;
        
        deleteTargetMenu.setEnabled( false );
        deleteRadarMenu.setEnabled( true );
        Route.setEnabled( true );
        canvasMap.repaint();
    }//GEN-LAST:event_newRadarMenuActionPerformed

    private void newTargetMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newTargetMenuActionPerformed

        LatLong tempLL = new LatLong(38.5, 121.5);      //set the position
        
        //create a temp
        Target tempTarget = new Target( "Underground Bunker", tempLL,
            "0", buildScene.targetMap, 100.0 );
        
        //add it to the scene
        buildScene.addTarget( tempTarget );
        selectedTarget = buildScene.targetCount - 1;
        selectedRadar = -1;
        
        //set menus
        deleteTargetMenu.setEnabled( true );
        deleteRadarMenu.setEnabled( false );
        Route.setEnabled( true );
        
        canvasMap.repaint();
        
    }//GEN-LAST:event_newTargetMenuActionPerformed

    private void cancelButtonEditRadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonEditRadActionPerformed
        editRadDialog.setVisible( false );
    }//GEN-LAST:event_cancelButtonEditRadActionPerformed

    private void okButtonEditRadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonEditRadActionPerformed
        String tempStr, tempDesc;         //temp string
        double tempLat, tempLong;
        double tempImpor;
        double tempRad, tempRadMax, tempStrength;
        LatLong tempLL;         //temp latlong
        
        //get lat and long
        tempStr = editRadLatText.getText();
        tempLat = Double.parseDouble( tempStr );
        tempStr = editRadLongText.getText();
        tempLong = Double.parseDouble( tempStr );
        tempLL = new LatLong( tempLat, tempLong );
        
        tempStr = editRadImporText.getText();   //get importance
        tempImpor = Double.parseDouble( tempStr );
        
        tempDesc = editRadDescText.getText();
        
        tempStr = editRadRadText.getText();
        tempRad = Double.parseDouble( tempStr );
        tempStr = editRadMaxRadText.getText();
        tempRadMax = Double.parseDouble( tempStr );
        tempStrength = ((double) editRadStrSlider.getValue())/100.0;
          
        //build a new radar from the information gathered from the 
        //properties dialog and add it to the scene
        buildScene.radarArray[selectedRadar] = new Radar( tempDesc, tempLL,
            "0", buildScene.targetMap, tempImpor, tempRad, tempRadMax, 
            tempStrength);
        
        canvasMap.repaint();
        
        editRadDialog.setVisible( false );
    }//GEN-LAST:event_okButtonEditRadActionPerformed

    private void objectPropActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_objectPropActionPerformed
        if( selectedRadar != -1 ){
            showEditRadar();
        }else if( selectedTarget != -1 ){
            showEditTarget();
        }
    }//GEN-LAST:event_objectPropActionPerformed

    private void editTarCancelAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editTarCancelAction
        editTarDialog.setVisible( false );
    }//GEN-LAST:event_editTarCancelAction

    private void editTarOKAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editTarOKAction
        String tempStr;         //temp string
        double tempLat, tempLong;
        double tempImpor;
        LatLong tempLL;         //temp latlong
        
        //get lat and long
        tempStr = editTarLatText.getText();
        tempLat = Double.parseDouble( tempStr );
        tempStr = editTarLongText.getText();
        tempLong = Double.parseDouble( tempStr );
        tempLL = new LatLong( tempLat, tempLong );
        
        tempStr = editTarImporText.getText();   //get importance
        tempImpor = Double.parseDouble( tempStr );
        
        tempStr = editTarDescText.getText();
        
        //take all that temp info, build a new radar and add it to the scene
        buildScene.targetArray[selectedTarget] = new Target( tempStr, tempLL,
            "0", buildScene.targetMap, tempImpor );
        
        canvasMap.repaint();
        
        editTarDialog.setVisible( false );
    }//GEN-LAST:event_editTarOKAction

    private void optionsCancelAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_optionsCancelAction
        targetOptions.setVisible(false);
    }//GEN-LAST:event_optionsCancelAction

    private void optionsOKAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_optionsOKAction
        //first get target count from text box
        String tempStr = targetCountText.getText();
        numTargets = Integer.parseInt( tempStr );
        
        //now get radar count from text box
        tempStr = radarCountText.getText();
        numRadars = Integer.parseInt( tempStr );
        
        //radar settings
        tempStr = radarRadText.getText();
        initRadius = Double.parseDouble( tempStr );
        tempStr = radarMaxRadText.getText();
        maxRadius = Double.parseDouble( tempStr );
        
        //water check
        checkForWater = waterCheckBox.isSelected();
        
        //check mode
        if( randomModeRadio.isSelected() ){
            currentStrat = randomGen;
            Object.setEnabled( false );
            GA.setEnabled( false );
        }else if( humanModeRadio.isSelected() ){
            currentStrat = humanGen;
            Object.setEnabled( true );
            GA.setEnabled( false );
        }else if( gaModeRadio.isSelected() ){
            currentStrat = gaGen;
            Object.setEnabled( false );
            GA.setEnabled( true );
        }
        
        coverageEps = (double) coverageSlider.getValue(); 
        initialStr = ((double) radarStrSlider.getValue() / 100.0);
        
        /*GA Panel settings */
        mobileThreatCount = Integer.parseInt(mobileThreatsText.getText());
        gaPop = Integer.parseInt( gaPopText.getText());
        gaGenCount = Integer.parseInt( gaGenText.getText());
        if( gaLocModeRadio.isSelected()){
            gaMode = 0;
        }else{
            gaMode = 1;
        }
        gaThreatRad = Integer.parseInt( gaThreatRadText.getText());
        
        targetOptions.setVisible(false);
    }//GEN-LAST:event_optionsOKAction

    private void editOptionsAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editOptionsAction
        showOptions();
    }//GEN-LAST:event_editOptionsAction

    private void aboutAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutAction
        showAboutBox();
    }//GEN-LAST:event_aboutAction

    private void newAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newAction
        newScene();
    }//GEN-LAST:event_newAction

    private void aboutDeactivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_aboutDeactivated
        aboutBox.toFront();
    }//GEN-LAST:event_aboutDeactivated

    private void showAbout(javax.swing.event.MenuDragMouseEvent evt) {//GEN-FIRST:event_showAbout
        showAboutBox();
    }//GEN-LAST:event_showAbout

    private void showAboutBox(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_showAboutBox
        showAboutBox();
    }//GEN-LAST:event_showAboutBox
       
    /* Pops up the Radar's properties dialog
     */
    private void showEditRadar(){
        String tempStr;         //temp string
        LatLong tempLL;         //temp latlong
        
        //edit the target's id
        editRadIDEdit.setText( Integer.toString( selectedRadar + 1 ));
        tempLL = buildScene.radarArray[selectedRadar].GetLatLong();
        
        //get target's info and set it to the dialog
        editRadLatText.setText( Double.toString( tempLL.GetLat() ) );
        editRadLongText.setText( Double.toString( tempLL.GetLong() ));
        editRadDescText.setText( buildScene.radarArray[selectedRadar].GetTID());
        editRadImporText.setText( Double.toString( buildScene.radarArray[selectedRadar].GetImportance()) );
        editRadRadText.setText( Double.toString( buildScene.radarArray[selectedRadar].GetRadius()));
        editRadMaxRadText.setText( Double.toString( buildScene.radarArray[selectedRadar].GetMaxRadius()));
        editRadStrSlider.setValue( (int) (buildScene.radarArray[selectedRadar].GetStr() *
            100.0) );
        
        //move the box where we want it
        editRadDialog.setTitle("Edit Radar Properties");
        editRadDialog.setBounds(50, 50, 327, 440 );
        editRadDialog.setResizable( false );
        
        editRadDialog.setVisible(true);
    }
    
    /* Pops up the Target's properties box
     */
    private void showEditTarget(){
        String tempStr;         //temp string
        LatLong tempLL;         //temp latlong
        editTarIDEdit.setText( Integer.toString( selectedTarget + 1 ));
        tempLL = buildScene.targetArray[selectedTarget].GetLatLong();
        
        //get target's info and set it to the dialog
        editTarLatText.setText( Double.toString( tempLL.GetLat() ) );
        editTarLongText.setText( Double.toString( tempLL.GetLong() ));
        editTarDescText.setText( buildScene.targetArray[selectedTarget].GetTID());
        editTarImporText.setText( Double.toString( buildScene.targetArray[selectedTarget].GetImportance()) );
        
        //move the box where we want it
        editTarDialog.setTitle("Edit Target Properties");
        editTarDialog.setBounds(50, 50, 327, 313 );
        editTarDialog.setResizable( false );
        
        editTarDialog.setVisible(true);
        
    }
    /* Shows the Options Menu
     */
    private void showOptions(){
        //set the text fields
        String tempStr = Integer.toString( numTargets );
        targetCountText.setText(tempStr);
        tempStr = Integer.toString( numRadars );
        radarCountText.setText(tempStr);
        tempStr = Double.toString( initRadius );
        radarRadText.setText(tempStr);
        tempStr = Double.toString( maxRadius );
        radarMaxRadText.setText(tempStr);
                
        waterCheckBox.setSelected(checkForWater);     //water checkbox
        
        switch(currentStrat){
            case 1:                     //random case
                randomModeRadio.setSelected(true);
                break;
            case 2:
                humanModeRadio.setSelected(true);
            default:
                break;
        }
        
        //Slider...you stink
        coverageSlider.setValue( (int) coverageEps );
        radarStrSlider.setValue( (int) (initialStr * 100.0 ));
        
        /*GA Pane */
        mobileThreatsText.setText( Integer.toString( mobileThreatCount ));
        gaPopText.setText( Integer.toString( gaPop ));
        gaGenText.setText( Integer.toString( gaGenCount ));
        if( gaMode == 0 ){
            gaLocModeRadio.setSelected(true);
        }else{
            gaAlgModeRadio.setSelected(true);
        }
        gaThreatRadText.setText( Integer.toString( gaThreatRad ));
        
        //move the box where we want it
        targetOptions.setTitle("Edit Options");
        targetOptions.setBounds(50, 50, 325, 315 );
        targetOptions.setResizable( false );
                     
        targetOptions.setVisible(true);      
    }
      
    //the shows the about box
    private void showAboutBox(){
        
        //add the tabs and image
        aboutTabPane = new javax.swing.JTabbedPane();
        aboutPainter aboutPaint = new aboutPainter();
        aboutBox.getContentPane().add(aboutTabPane, java.awt.BorderLayout.CENTER);
        aboutTabPane.addTab("About", aboutPaint);
        
        //move the box where we want it
        aboutBox.setTitle("About");
        aboutBox.setBounds(50, 50, 450, 412 );
        aboutBox.setResizable( false );
        aboutBox.setVisible(true);
    }
    
    private void randomSelected(){
        currentStrat = randomGen;
    }
    
    //generates the new scene
    private void newScene(){
       
        //wipe the board
        initCanvas();
        
        //set everything unselected
        selectedRadar = selectedTarget = -1;
        
        //this creates our radars and targets
        buildScene = new sceneBuilder(targetMap);
        drawGA = drawRoute = false;
        waypointsL.clear();
        threats.clear();
       
        //depending on our mode, do the right thing
        if( currentStrat == randomGen ){
            buildScene.generateTargets( numTargets );
            buildScene.generateRadars( numRadars, initRadius, maxRadius,
                initialStr);

            if( checkForWater ){
                 //check for water-based targets
                 waterCheck();
            }

            buildScene.defendTarget(coverageEps);

            displayScene = true;
            Edit.setEnabled( false );
            objectProp.setEnabled( false );
            
        } else if( currentStrat == humanGen ){
            displayScene = true;
            Edit.setEnabled( true );
            objectProp.setEnabled( true );
        } else if( currentStrat == gaGen ){
            displayScene = true;
            GA.setEnabled( true );        
        }
    }
    
    public void startGA(){
        LatLong tempLL;
        threats.clear();                    //dump the last solution
        drawGA = true;                      //set to draw
        WaterCheck waterCheckInst = new WaterCheck();
        
        if( waterCheckInst.initGrabber( image, this ) == false ){
            System.out.println( "ERROR:Failed to initialize PixelGrabber.");     
        }
            
        //initialize app
        threatGAApp gaApp = new threatGAApp(buildScene, mobileThreatCount,
            gaPop, gaGenCount, waterCheckInst, carrier, gaThreatRad);
        
        //get our winner
        threats = gaApp.getThreats();
        
        //print
        if( DEBUG ){
            ListIterator it = threats.listIterator(0 );
            while( it.hasNext() ){
                tempLL = (LatLong) it.next();
                System.out.println( "GA Results: " + tempLL.toString() );
            }
        }
        gaTimer.start();
    }
        
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField editTarLatText;
    private javax.swing.JPanel randomPanel;
    private javax.swing.JLabel gaGenLabel;
    private javax.swing.JTextField editRadRadText;
    private javax.swing.JMenu Help;
    private javax.swing.JMenu Options;
    private javax.swing.JInternalFrame Map;
    private javax.swing.JTextField editRadMaxRadText;
    private javax.swing.JMenuItem newRadarMenu;
    private javax.swing.JPanel editTarPanel;
    private javax.swing.JMenu Route;
    private javax.swing.JMenuItem paste;
    private javax.swing.JLabel editRadIDEdit;
    private javax.swing.JTextField editRadLongText;
    private javax.swing.JSeparator objectMenuSep;
    private javax.swing.JTextField radarMaxRadText;
    private javax.swing.JTextField editRadImporText;
    private javax.swing.JLabel gaPopLabel;
    private javax.swing.JLabel editRadWeakStrLabel;
    private javax.swing.JTextField gaPopText;
    private javax.swing.JLabel editRadImporLabel;
    private javax.swing.JMenuItem objectProp;
    private javax.swing.JLabel radarStrStrongLabel;
    private javax.swing.JLabel radarCoverageLabel;
    private javax.swing.JPanel modePanel;
    private javax.swing.JSeparator deleteSep;
    private javax.swing.JLabel radarStrLabel;
    private javax.swing.JLabel editRadIDLabel;
    private javax.swing.JLabel editRadStrongLabel;
    private javax.swing.JLabel editTarLatLabel;
    private javax.swing.JTextField editRadDescText;
    private javax.swing.JMenuItem deleteTargetMenu;
    private javax.swing.JLabel editRadRadLabel;
    private javax.swing.JRadioButton gaLocModeRadio;
    private javax.swing.JRadioButton gaAlgModeRadio;
    private javax.swing.JTextField editTarLongText;
    private javax.swing.JLabel editTarTitleLabel;
    private javax.swing.JLabel editTarImporLabel;
    private javax.swing.JRadioButton gaModeRadio;
    private javax.swing.JLabel radarStrWeakLabel;
    private javax.swing.JMenuItem editOptions;
    private javax.swing.JButton okButtonEditRad;
    private javax.swing.JLabel gaThreatRadLabel;
    private javax.swing.JTextField mobileThreatsText;
    private javax.swing.JButton cancelButtonEditRad;
    private javax.swing.JPanel radarPanel;
    private javax.swing.JLabel editRadTitleLabel;
    private javax.swing.JMenu File;
    private javax.swing.JLabel minLabel;
    private javax.swing.JMenuItem newScene;
    private javax.swing.ButtonGroup gaButtonGroup;
    private javax.swing.JDialog editRadDialog;
    private javax.swing.JTextField editTarDescText;
    private javax.swing.JTextField gaGenText;
    private javax.swing.JMenu GA;
    private javax.swing.JMenuItem showAbout;
    private javax.swing.JMenuItem copy;
    private javax.swing.JSlider editRadStrSlider;
    private javax.swing.JLabel editRadLatLabel;
    private javax.swing.JLabel radarMaxLabel;
    private javax.swing.JMenu Edit;
    private javax.swing.JLabel editRadStrLabel;
    private javax.swing.JButton okButton;
    private javax.swing.JRadioButton humanModeRadio;
    private javax.swing.JDialog aboutBox;
    private javax.swing.JMenuItem clearRouteMenu;
    private javax.swing.JSlider coverageSlider;
    private javax.swing.JTextField targetCountText;
    private javax.swing.JRadioButton randomModeRadio;
    private javax.swing.JButton cancelButton;
    private javax.swing.JMenu Object;
    private javax.swing.JMenuItem deleteRadarMenu;
    private javax.swing.JLabel gaModeLabel;
    private javax.swing.JPanel gaOptionsPanel;
    private javax.swing.JSlider radarStrSlider;
    private javax.swing.JDialog targetOptions;
    private javax.swing.JTabbedPane aboutTabPane;
    private javax.swing.JMenuItem gaStartMenu;
    private javax.swing.JTextField radarRadText;
    private javax.swing.JLabel maxLabel;
    private javax.swing.JTabbedPane mainTab;
    private javax.swing.JTextField gaThreatRadText;
    private javax.swing.JCheckBox waterCheckBox;
    private javax.swing.JLabel editTarDescLabel;
    private javax.swing.JLabel editRadLongLabel;
    private javax.swing.JLabel targetCountLabel;
    private javax.swing.JLabel editTarLongLabel;
    private javax.swing.JMenuItem showRouteMenu;
    private javax.swing.ButtonGroup modeButtonGroup;
    private javax.swing.JLabel editTarTargetIDLabel;
    private javax.swing.JTextField radarCountText;
    private javax.swing.JLabel editTarIDEdit;
    private javax.swing.JMenuItem cut;
    private javax.swing.JButton cancelButtonEditTar;
    private javax.swing.JTabbedPane optionsTabPane;
    private javax.swing.JLabel radarInitLabel;
    private javax.swing.JTextField editRadLatText;
    private javax.swing.JDialog editTarDialog;
    private javax.swing.JMenuBar topMenu;
    private javax.swing.JMenuItem newTargetMenu;
    private javax.swing.JLabel radarCountLabel;
    private javax.swing.JLabel mobileThreatsLabel;
    private javax.swing.JLabel editRadMaxRadLabel;
    private javax.swing.JButton okButtonEditTar;
    private javax.swing.JLabel editRadDescLabel;
    private javax.swing.JTextField editTarImporText;
    // End of variables declaration//GEN-END:variables
  
     //Applet Initialize Canvas Method
     private void initCanvas() {
        canvasMap = new mapDisplayer();
        Map.getContentPane().addMouseListener( canvasMap );
        Map.getContentPane().add( canvasMap );
     }
     
     //main applet's paint method
    public void paint( Graphics g ){
        super.paint(g);
    }
    
    //Applet Start method
    public void start(){    
    }
     
    //Applet Stop method
    public void stop(){
    }
     
    //Applet Run method
    public void run() {  
    }
    
    //Applet destroy method
    public void destroy(){
    }
    
    //Map Displayer Class -- Used to build a canvas (our map)
    class mapDisplayer extends JPanel implements MouseListener {
        private boolean DEBUG = false;
       
        MediaTracker tracker;       //tracks media(images)
        Polygon radarPoly;
       
        public mapDisplayer(){
          /* Load Image and Tracker */
          tracker = new MediaTracker(this);
          image = getImage(getDocumentBase(), "canv-768.jpg");
          tracker.addImage( image, 0 );
          
          //make sure everything loaded
          try
          {
            tracker.waitForAll();
          }
          catch (InterruptedException e) {
            System.out.println("Could not load pixel grabber's image.");
            System.exit(-101);
          }
          
          targetMap = new StrikeMap(118.0, 125.0, 41.0, 36.00, 
            image.getWidth(this), image.getHeight(this));
        }
        
        //Paint Methode
        public void paint( Graphics g ) {
            int i; //loop counter
            LatLong tempLL;               //temp LongLat, used to place targets
            ScreenLoc tempSL = new ScreenLoc(0, 0); // used to place targ
            int[] xPoints, yPoints;
            PolyGen genFact = new PolyGen();  //poly factory
            boolean drawCursor = false;
            ScreenLoc saveSL = new ScreenLoc( 0, 0);
            
            
            //draw the map
            g.drawImage(image, 0, 0, this);
            
            //our color used throughout the drawing
            Color tempColor = new Color( 255, 0, 0, 210 );
            if( displayScene ){
                
                //output image height
                if( DEBUG  ){
                    System.out.println( "Image Height: " + image.getHeight(this)
                        + " Image Width: " + image.getWidth(this));
                }

               //walk through each target and render it on the screen
                for( i = 0; i < buildScene.targetCount; i++ ){
                    tempColor = new Color( 252, 250, 78, 255 );
                    g.setColor( tempColor);                  
                    //get the screen location
                    tempSL = buildScene.targetMap.MapToScreenCoords(buildScene.targetArray[i].GetLatLong());
                    
                    //draw the polygon with the help of polygen
                    g.fillPolygon( genFact.makeTargetPoly( tempSL, 10, 6) );

                    //highlight selected poly
                    if( selectedTarget == i ){
                        drawCursor = true;
                        saveSL = tempSL;
                    }
                    
                    //output target's coordinates
                    if(DEBUG){
                        System.out.println( "Target Coordinates: " 
                        + tempSL.GetX() + ", " + tempSL.GetY());
                    }

                }

                //walk through each radar and render it on the screen
                for( i = 0; i < buildScene.radarCount; i++ ){
                    
                    //green is a good color with some alpha
                    tempColor = new Color( 255, 28, 17, 255);
                    g.setColor( tempColor);

                    //get screen locs
                    tempSL = buildScene.targetMap.MapToScreenCoords(buildScene.radarArray[i].GetLatLong());
                    
                    //draw the poly
                    g.fillPolygon( genFact.makeRadarPoly(tempSL, 8, 6) );
                                       
                    //blue is a good color
                    tempColor = new Color( 0, 25, 210, 65 );
                    g.setColor( tempColor);
                    g.fillOval( (int)(tempSL.GetX())- (int)buildScene.radarArray[i].GetRadius()/2,
                        (int)(tempSL.GetY())-(int)buildScene.radarArray[i].GetRadius()/2 ,
                        (int)buildScene.radarArray[i].GetRadius(),
                        (int)buildScene.radarArray[i].GetRadius());
                    
                                        //highlight selected poly
                    if( selectedRadar == i ){
                         drawCursor = true;
                         saveSL = tempSL;
                    }

                    //output radar's coordinates
                    if(DEBUG){
                        System.out.println( "Radar Coordinates: " 
                        + (int)tempSL.GetX()
                        + ", " +(int)tempSL.GetY());
                    }
                }
                
                //draw the carrier
                tempColor = new Color( 1, 229, 60, 255 );
                g.setColor( tempColor);
                g.fillPolygon( genFact.makeCarrierPoly( carrier, 10, 5 ));
                
                
                //if something is selected
                if( drawCursor ){
                    if( selectedTarget != -1 ){
                            tempColor = new Color( 0, 0, 0, cursorAlpha );
                            g.setColor( tempColor);
                            g.fillPolygon( genFact.makeTargetPoly( saveSL,
                                10, 6));
                    } else if( selectedRadar != -1 ){
                            tempColor = new Color( 255, 255, 255, cursorAlpha );
                            g.setColor( tempColor);
                            g.fillPolygon( genFact.makeRadarPoly( saveSL,
                                8, 6 ));
                            tempColor = new Color( 0, 255, 0, 210 );
                            g.setColor( tempColor);
                    }
                }
                
                //if someone planned a route
                if( drawRoute ){
                    Location prevL, tempL;
                    tempColor = new Color( 218, 131, 247, 255 );
                    g.setColor( tempColor );
                    
                    //walk the list of points
                    ListIterator it = waypointsL.listIterator(0);
                    if( it.hasNext()){
                        prevL = (Location)it.next();
                    }else{
                        return;
                    }
                    while( it.hasNext()){
                        tempL = (Location) it.next();
                        g.drawLine( prevL.x, prevL.y, tempL.x, tempL.y);
                        prevL = tempL;
                    }
                }
                
                //if the GA is in its turquoise mode, then draw those
                //later those turquoise ones get added to the scene
                if( drawGA ){
                    
                    ListIterator listWalk = threats.listIterator(0);
                    while( listWalk.hasNext() ){
                        tempSL = targetMap.MapToScreenCoords( (LatLong)listWalk.next());
                        tempColor = new Color( 255, 28, 17, 255);
                        g.setColor( tempColor);

                        //draw the poly
                        g.fillPolygon( genFact.makeRadarPoly(tempSL, 8, 6) );

                        tempColor = new Color( 25, 225, 210, 75 );
                        g.setColor( tempColor);
                        g.fillOval( (int)(tempSL.GetX())- (int)gaThreatRad/2,
                            (int)(tempSL.GetY())-(int)gaThreatRad/2 ,
                            gaThreatRad,
                            gaThreatRad);                     
                    }
                }
                    
            }
        }
        
        /** Invoked when the mouse button has been clicked (pressed
         * and released) on a component.
         *
         */
        public void mouseClicked(MouseEvent e) {
            if( javax.swing.SwingUtilities.isLeftMouseButton(e) ){
                int i;          //loop counter
                
                LatLong tempLL;               //temp LongLat, used to place targets
                ScreenLoc tempSL;             //temp ScreenLoc, used to place targ
                double selectThresh = 25.0;
                double closestTarg, closestRad, tempDist;
                Point tempPoint;
                int closestTargIdx = -1;
                int closestRadIdx = -1;

                closestTarg = 10000.0;          //set to large number
                closestRad = 10000.0;

                if( DEBUG ){
                    System.out.println( "Mouse Clicked!" );
                }

                //find the closest target
                for( i = 0; i < buildScene.targetCount; i++ ){

                   tempSL = buildScene.targetMap.MapToScreenCoords(buildScene.targetArray[i].GetLatLong());
                   tempPoint = e.getPoint();
                   tempDist = buildScene.distanceTo( tempPoint.x, tempPoint.y,
                   tempSL.GetX(), tempSL.GetY());
                   if( tempDist < closestTarg ){
                       closestTarg = tempDist;
                       closestTargIdx = i;
                   }
                }

                //find the closest radar
                for( i = 0; i < buildScene.radarCount; i++ ){

                   tempSL = buildScene.targetMap.MapToScreenCoords(buildScene.radarArray[i].GetLatLong());
                   tempPoint = e.getPoint();
                   tempDist = buildScene.distanceTo( tempPoint.x, tempPoint.y,
                   tempSL.GetX(), tempSL.GetY());
                   if( tempDist < closestRad ){
                       closestRad = tempDist;
                       closestRadIdx = i;
                   }
                }

                //now, determine the winner
                if( closestTargIdx != -1 && closestTarg <= selectThresh &&
                    closestTarg < closestRad  && currentStrat == humanGen ){
                    selectedTarget = closestTargIdx;
                    selectedRadar = -1;
                    Edit.setEnabled( true );
                    objectProp.setEnabled( true );
                    deleteTargetMenu.setEnabled( true );
                    deleteRadarMenu.setEnabled( false );
                    Route.setEnabled(true);
                }else if( closestRadIdx != -1 && closestRad <= selectThresh &&
                    currentStrat == humanGen){
                    selectedRadar = closestRadIdx; 
                    selectedTarget = -1;
                    Edit.setEnabled( true );
                    objectProp.setEnabled( true );
                    deleteRadarMenu.setEnabled( true );
                    deleteTargetMenu.setEnabled( false );
                    Route.setEnabled(true);
                }else{
                    selectedRadar = selectedTarget = -1;
                    Edit.setEnabled( false );
                    objectProp.setEnabled( false );
                    deleteRadarMenu.setEnabled( false );
                    deleteTargetMenu.setEnabled( false );
                }
            }else if( javax.swing.SwingUtilities.isRightMouseButton(e) ){
                if( selectedTarget != -1 ){
                   ScreenLoc tempSL = new ScreenLoc( e.getX(), e.getY());
                   LatLong tempLL = buildScene.targetMap.ScreenToMapCoords(tempSL);                    
                    
                   buildScene.targetArray[selectedTarget] = new Target( 
                        buildScene.targetArray[selectedTarget].GetTID(),
                        tempLL, "0", buildScene.targetMap,
                        buildScene.targetArray[selectedTarget].GetImportance() );
                }else if( selectedRadar != -1 ){
                    //get the screenlocation, then create a new radar
                   ScreenLoc tempSL = new ScreenLoc( e.getX(), e.getY());
                   LatLong tempLL = buildScene.targetMap.ScreenToMapCoords(tempSL);                    
                    
                   buildScene.radarArray[selectedRadar] = new Radar( 
                        buildScene.radarArray[selectedRadar].GetTID(),
                        tempLL, "0", buildScene.targetMap,
                        buildScene.radarArray[selectedRadar].GetImportance(),
                        buildScene.radarArray[selectedRadar].GetRadius(),
                        buildScene.radarArray[selectedRadar].GetMaxRadius(),
                        buildScene.radarArray[selectedRadar].GetStr());
                }
            }
            this.repaint();
        }
        
        /** Invoked when the mouse enters a component.
         *
         */
        public void mouseEntered(MouseEvent e) {
             if( DEBUG ){
                System.out.println( "Mouse Entered" );
            }
        }
        
        /** Invoked when the mouse exits a component.
         *
         */
        public void mouseExited(MouseEvent e) {
            if( DEBUG ){
                System.out.println( "Mouse Exited" );
            }
        }
        
        /** Invoked when a mouse button has been pressed on a component.
         *
         */
        public void mousePressed(MouseEvent e) {
            if( DEBUG ){
                System.out.println( "Mouse Pressed" );
            }
        }
        
        /** Invoked when a mouse button has been released on a component.
         *
         */
        public void mouseReleased(MouseEvent e) {
            if( DEBUG ){
                System.out.println( "Mouse Released" );
            }
        }
    }
    
    /* Paints our About Box */
    class aboutPainter extends JPanel{
        Image bomber;
        MediaTracker tracker;       //tracks media(images)
        public aboutPainter(){
          
          /* Load Image and Tracker */
          tracker = new MediaTracker(this);
          bomber = getImage(getDocumentBase(), "slickchicktex.jpg");
          tracker.addImage( bomber, 0 );
          
          //make sure everything loaded
          if( tracker.isErrorAny() ){
            //failed to load an image
            System.out.println( "ERROR:MapDisplayer: Failed to load image.");
          }       
        }
        
        //now paint the scene
        public void paint( Graphics g ){
            g.drawImage(bomber, 0, 0, this);
        }
    }
    
    //if it sees a pixel in water, it relocates it
    private void waterCheck(){
        int tempX;              //temp X coordinate relocate water targets/radar
        int tempY;              //temp Y " "
        int i;                  //loop counter
        int xInc, yInc;         //our conversion factor (lat/long->pixel coord)
        boolean notInWater = false;
        boolean DEBUG = false;
        ScreenLoc tempSL;        //temp screen location
        WaterCheck waterCheckInst = new WaterCheck();
        
 
        //grab the image's pixels 
        if( waterCheckInst.initGrabber( image, this ) == false ){
            System.out.println( "ERROR:Failed to initialize PixelGrabber.");
            
        }
                
        //this is a double for loop.  Once we check to see if was in water.
        //if it is, random relocate, and recheck.  It has to pass the test
        //twice to break
        while( !notInWater ){
            notInWater = true;
            for( i = 0; i < buildScene.targetCount; i++ ){
                if(DEBUG){
                     System.out.println(" Calling Check for water: ");
                }
                tempSL = buildScene.targetMap.MapToScreenCoords(buildScene.targetArray[i].GetLatLong());
                tempX = tempSL.GetX();
                tempY = tempSL.GetY();
                
                //if the x or y coordinate is zero, the minus four will mess
                //up our pixel array and we'll segfault. Compensate
                if( tempY < 0 ){
                    tempY = 0;
                }
                if( tempX < 0 ){
                    tempX = 0;
                }
                
                if( waterCheckInst.handlepixels( 0, 0, image.getWidth(this),
                    image.getHeight(this), tempX, tempY)){
                    if( DEBUG ){
                        System.out.println( "Landed in Water.");
                    }
                    notInWater = false;
                    buildScene.randomRelocateTarget( i );                   
                }
              
            }
            
            //second check
            for( i = 0; i < buildScene.radarCount; i++ ){
                tempSL = buildScene.targetMap.MapToScreenCoords(buildScene.radarArray[i].GetLatLong());
                tempX = tempSL.GetX();
                tempY = tempSL.GetY();
                if( tempY < 0 ){
                    tempY = 0;
                }
                if( tempX < 0 ){
                    tempX = 0;
                }
                if( waterCheckInst.handlepixels( 0, 0, image.getWidth(this),
                    image.getHeight(this), tempX, tempY)){
                    if( DEBUG ){
                        System.out.println( "Landed in Water.");
                    }
                    notInWater = false;
                    buildScene.randomRelocateRadar( i );                   
                }
            }   
        }
    }
    
   /* Timer Event.  Controls the blinking cursor
    */
    javax.swing.Timer timer = new javax.swing.Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        
        //are we going up or down?
	if( cursorAlpha > 225 ){
            goUp = false;
        }else if ( cursorAlpha < 100 ){
            goUp = true;
        }
        
        if( goUp == true ){
            cursorAlpha = 230;
        }else{
            cursorAlpha = 0;
        }
        canvasMap.repaint();
    }    
    });
    
      /* Timer Event.  Controls the GA fade
    */
    javax.swing.Timer gaTimer = new javax.swing.Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
 
        //count the seconds    
        if( gaBlinkCount < 5 ){
            gaBlinkCount++;
        }else{
            //once we get 4, we copy the threats from the GA list
            //into our scene
            gaBlinkCount = 0;
            drawGA = false;
            ListIterator it = threats.listIterator(0);

            while( it.hasNext() ){
                buildScene.addRadar(new Radar( "GA Radar", (LatLong) it.next(),
                    "0", buildScene.targetMap, 100.0, (double)gaThreatRad,
                    (double)gaThreatRad, initialStr)  );
            }
            threats.clear();
            gaTimer.stop();
        }
    }    
    });
     
    class RouterThread extends Thread {
        Router router = null;

        /** Creates a new instance of RouterThread */
        public RouterThread() {
            //create a router
            router = new Router( 768, 
                549, 0, 0, 768, 
                549, 0, 0);  
            start();
        }

        public void run(){
            int i;                      //loop counter
            waypointsL.clear();         //clear old points
            ScreenLoc tempSL = new ScreenLoc( 0, 0 );

            //create the threat map
            for( i = 0; i < buildScene.radarCount; i++ ){
                router.addRadar(buildScene.radarArray[i]);
            }

            //check the targets/radars if selected
            if( selectedTarget != -1 ){
                tempSL = buildScene.targetArray[selectedTarget].GetScreenLoc();
                waypointsL = router.findRoute( carrier.GetX(), carrier.GetY(),
                    tempSL.GetX(), tempSL.GetY());
            } else if( selectedRadar != -1 ){
                tempSL = buildScene.radarArray[selectedRadar].GetScreenLoc();
                waypointsL = router.findRoute( carrier.GetX(), carrier.GetY(),
                    tempSL.GetX(), tempSL.GetY());
            }else{
                //error checking, but we should never hit this case
                drawRoute = false;
                return;
            }

            drawRoute = true;
            clearRouteMenu.setEnabled( true );
        }
    
        protected void finalize(){}
   }//end of routerthread
}//end of scene App
