Index: trunk/src/scriptbuilder/gui/ScriptBuilderFrame.java
===================================================================
--- trunk/src/scriptbuilder/gui/ScriptBuilderFrame.java	(revision 7)
+++ trunk/src/scriptbuilder/gui/ScriptBuilderFrame.java	(revision 8)
@@ -14,8 +14,12 @@
 import java.awt.event.KeyListener;
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Observable;
 import java.util.Observer;
+import java.util.Properties;
 import java.util.Random;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import javax.swing.DefaultListModel;
 import javax.swing.JButton;
@@ -55,5 +59,4 @@
      */
     private ArrayList<JButton> eventButtons = null;
-
     /**
      * True if we are currently editing an incident.
@@ -226,5 +229,4 @@
         @Override
         public void keyReleased(KeyEvent e)
-
         {
         }
@@ -1046,5 +1048,5 @@
         incidentTimelinePanel7Layout.setHorizontalGroup(
             incidentTimelinePanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 6884, Short.MAX_VALUE)
+            .addGap(0, 6882, Short.MAX_VALUE)
         );
         incidentTimelinePanel7Layout.setVerticalGroup(
@@ -1290,5 +1292,5 @@
                     .addComponent(incidentNumberPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                     .addComponent(incidentTimelinePanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
-                .addContainerGap(252, Short.MAX_VALUE))
+                .addContainerGap(251, Short.MAX_VALUE))
         );
 
@@ -1769,5 +1771,5 @@
         timeStampPanelLayout.setHorizontalGroup(
             timeStampPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 1008, Short.MAX_VALUE)
+            .addGap(0, 1032, Short.MAX_VALUE)
         );
         timeStampPanelLayout.setVerticalGroup(
@@ -1951,4 +1953,11 @@
 
         helpAbout.setText("About...");
+        helpAbout.addActionListener(new java.awt.event.ActionListener()
+        {
+            public void actionPerformed(java.awt.event.ActionEvent evt)
+            {
+                helpAboutActionPerformed(evt);
+            }
+        });
         helpMenu.add(helpAbout);
 
@@ -2053,17 +2062,13 @@
 
     private void cadEventMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cadEventMousePressed
-
     }//GEN-LAST:event_cadEventMousePressed
 
     private void radioEventMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_radioEventMousePressed
-
     }//GEN-LAST:event_radioEventMousePressed
 
     private void cadEventMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cadEventMouseReleased
-
     }//GEN-LAST:event_cadEventMouseReleased
 
     private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
-
     }//GEN-LAST:event_okButtonActionPerformed
 
@@ -2080,5 +2085,4 @@
 
     private void editEventListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editEventListActionPerformed
-
     }//GEN-LAST:event_editEventListActionPerformed
 
@@ -2124,6 +2128,6 @@
             script.incidents.add(indx,
                     new ScriptIncident(SimulationScript.incidentColors[indx],
-                            (Integer) addIncidentNumber.getValue(), addIncidentName.getText(), addIncidentDescription.getText(),
-                            script));
+                    (Integer) addIncidentNumber.getValue(), addIncidentName.getText(), addIncidentDescription.getText(),
+                    script));
             script.incidents.get(indx).length = (Integer) addIncidentLength.getValue() * 60;
             script.incidents.get(indx).setOffset((Integer) addIncidentStart.getValue() * 60);
@@ -2152,6 +2156,6 @@
             script.incidents.add(oldIncidentIndex,
                     new ScriptIncident(SimulationScript.incidentColors[oldIncidentIndex],
-                            (Integer) addIncidentNumber.getValue(), addIncidentName.getText(), addIncidentDescription.getText(),
-                            script));
+                    (Integer) addIncidentNumber.getValue(), addIncidentName.getText(), addIncidentDescription.getText(),
+                    script));
             script.incidents.get(oldIncidentIndex).length = (Integer) addIncidentLength.getValue() * 60;
             script.incidents.get(oldIncidentIndex).slices = backup.slices;
@@ -2221,4 +2225,5 @@
         cadButton.setSelected(true);
     }//GEN-LAST:event_cadButtonActionPerformed
+
     /**
      * Selects CCTV_EVENT as the current type of new event, upon click of "CCTV
@@ -2235,4 +2240,5 @@
         cctvButton.setSelected(true);
     }//GEN-LAST:event_cctvButtonActionPerformed
+
     /**
      * Selects CHP_RADIO_EVENT as the current type of new event, upon click of
@@ -2251,5 +2257,4 @@
 
     private void fileMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileMenuActionPerformed
-
     }//GEN-LAST:event_fileMenuActionPerformed
 
@@ -2472,4 +2477,5 @@
         fc.showSaveDialog(this);
     }//GEN-LAST:event_generateOrganizationChartActionPerformed
+
     /**
      * Selects WITNESS_EVENT as the current type of new event, upon click of
@@ -2486,4 +2492,5 @@
         witnessButton.setSelected(true);
     }//GEN-LAST:event_witnessButtonActionPerformed
+
     /**
      * Selects UNIT_EVENT as the current type of new event, upon click of "Unit
@@ -2500,4 +2507,5 @@
         unitButton.setSelected(true);
     }//GEN-LAST:event_unitButtonActionPerformed
+
     /**
      * Selects TOW_EVENT as the current type of new event, upon click of "TOW
@@ -2514,4 +2522,5 @@
         towButton.setSelected(true);
     }//GEN-LAST:event_towButtonActionPerformed
+
     /**
      * Selects PARAMICS_EVENT as the current type of new event, upon click of
@@ -2528,4 +2537,5 @@
         paramicsButton.setSelected(true);
     }//GEN-LAST:event_paramicsButtonActionPerformed
+
     /**
      * Selects MAINTENANCE_RADIO_EVENT as the current type of new event, upon
@@ -2542,4 +2552,5 @@
         maintenanceRadioButton.setSelected(true);
     }//GEN-LAST:event_maintenanceRadioButtonActionPerformed
+
     /**
      * Selects ATMS_EVAL_EVENT as the current type of new event, upon click of
@@ -2556,4 +2567,5 @@
         atmsEvalButton.setSelected(true);
     }//GEN-LAST:event_atmsEvalButtonActionPerformed
+
     /**
      * Selects TELEPHONE_EVENT as the current type of new event, upon click of
@@ -2570,4 +2582,5 @@
         telephoneButton.setSelected(true);
     }//GEN-LAST:event_telephoneButtonActionPerformed
+
     /**
      * Selects TMT_RADIO_EVENT as the current type of new event, upon click of
@@ -2584,4 +2597,5 @@
         tmtRadioButton.setSelected(true);
     }//GEN-LAST:event_tmtRadioButtonActionPerformed
+
     /**
      * Selects CMS_EVAL_EVENT as the current type of new event, upon click of
@@ -2598,4 +2612,5 @@
         cmsEvalButton.setSelected(true);
     }//GEN-LAST:event_cmsEvalButtonActionPerformed
+
     /**
      * Selects CAD_EVAL_EVENT as the current type of new event, upon click of
@@ -2612,4 +2627,5 @@
         cadEvalButton.setSelected(true);
     }//GEN-LAST:event_cadEvalButtonActionPerformed
+
     /**
      * Selects ACTIVITY_LOG_EVAL_EVENT as the current type of new event, upon
@@ -2626,4 +2642,5 @@
         activityLogEvalButton.setSelected(true);
     }//GEN-LAST:event_activityLogEvalButtonActionPerformed
+
     /**
      * Selects RADIO_EVAL_EVENT as the current type of new event, upon click of
@@ -2640,4 +2657,5 @@
         radioEvalButton.setSelected(true);
     }//GEN-LAST:event_radioEvalButtonActionPerformed
+
     /**
      * Selects FACILITATOR_EVAL_EVENT as the current type of new event, upon
@@ -2654,4 +2672,5 @@
         facilitatorEvalButton.setSelected(true);
     }//GEN-LAST:event_facilitatorEvalButtonActionPerformed
+
     /**
      * Selects AUDIO_EVENT as the current type of new event, upon click of
@@ -2677,4 +2696,5 @@
         zoomSlider.setValue(zoomSlider.getValue() >= 21 ? 21 : zoomSlider.getValue() + 1);
     }//GEN-LAST:event_zoomInIconMouseClicked
+
     /**
      * Decreases zoom level upon click of the "Zoom out" icon.
@@ -2685,5 +2705,4 @@
         zoomSlider.setValue(zoomSlider.getValue() <= 5 ? 5 : zoomSlider.getValue() - 1);
     }//GEN-LAST:event_zoomOutIconMouseClicked
-
     private Color selectedColor = Color.BLACK;
 
@@ -2701,4 +2720,5 @@
         // TODO add your handling code here:
     }//GEN-LAST:event_XMLExportBtnActionPerformed
+
     /**
      * Upon click of the "Import From XML" menu option, allows user to choose an
@@ -2713,7 +2733,7 @@
         fc.setFileFilter(new ExtensionFileFilter("Simulation Script XML (.xml)",
                 new String[]
-                {
-                    "xml"
-                }));
+        {
+            "xml"
+        }));
         if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
         {
@@ -2723,7 +2743,45 @@
     }//GEN-LAST:event_XMLImportBtnActionPerformed
 
+    private void helpAboutActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_helpAboutActionPerformed
+    {//GEN-HEADEREND:event_helpAboutActionPerformed
+        JOptionPane.showMessageDialog(rootPane, "Revision: " + getAppVersion(), "About", JOptionPane.INFORMATION_MESSAGE);
+    }//GEN-LAST:event_helpAboutActionPerformed
+
+    /**
+     * Read the version number from the application properties. The file
+     * 'application.properties' is generated by build.xml.
+     *
+     * @return a version string obtained from application.properties file, or
+     * "Version: unknown" if an IOerror prevents us from reading the file.
+     */
+    private String getAppVersion()
+    {
+        String propfilename = "/scriptbuilder/gui/application.properties";
+        String propKey = "Application.revision";
+        String version = "unknown";
+        try
+        {
+            Properties props = new Properties();
+            props.load(this.getClass().getResourceAsStream(propfilename));
+            version = (String) props.get(propKey);
+        }
+        catch (IOException ex)
+        {
+            Logger.getLogger("scriptbuilder.gui").log(Level.SEVERE,
+                    "ScriptBuilderFrame.getAppVersion()."
+                    + " IOError reading " + propfilename);
+        }
+        catch (NullPointerException npe)
+        {
+            Logger.getLogger("scriptbuilder.gui").log(Level.SEVERE,
+                    "ScriptBuilderFrame.getAppVersion().load."
+                    + " Missing file: " + propfilename);
+        }
+        return version;
+    }
+
     /**
      * Runs the script builder.
-     * 
+     *
      * @param args the command line arguments
      */
@@ -2766,13 +2824,11 @@
         java.awt.EventQueue.invokeLater(
                 new Runnable()
-                {
-                    public void run()
-                    {
-                        new ScriptBuilderFrame().setVisible(true);
-                    }
-                }
-        );
+        {
+            public void run()
+            {
+                new ScriptBuilderFrame().setVisible(true);
+            }
+        });
     }
-
     // Variables declaration - do not modify//GEN-BEGIN:variables
     private javax.swing.JMenuItem XMLExportBtn;
@@ -2920,4 +2976,3 @@
     private javax.swing.JSlider zoomSlider;
     // End of variables declaration//GEN-END:variables
-
 }
