Index: trunk/build.xml
===================================================================
--- trunk/build.xml	(revision 7)
+++ trunk/build.xml	(revision 8)
@@ -11,9 +11,34 @@
     <description>Builds, tests, and runs the project ScriptBuilder_Repo.</description>
     <import file="nbproject/build-impl.xml"/>
+
+<!--        STORE SUBVERSION BUILD STRING      -->
+<target name="-post-init" description="Sets the buildversion for the current build">
+    <exec outputproperty="svna.version" executable="svnversion">
+        <arg value="-c" />
+        
+        <redirector>
+            <outputfilterchain>
+                <tokenfilter>
+                    <replaceregex pattern="^[0-9]*:?" replace="" flags="g"/>
+                    <replaceregex pattern="M" replace="" flags="g"/>
+                </tokenfilter>
+            </outputfilterchain>
+        </redirector>
+    </exec>
+    <propertyfile file="${src.dir}/scriptbuilder/gui/application.properties">
+        <entry key="Application.revision" value="${svna.version}" type="int" operation="="/>
+    </propertyfile>
+    <echo>Setting SVN version: ${svna.version}</echo>
+</target>
+<target name="-post-jar" description="Sets the buildversion for the current build">
+    <propertyfile file="${src.dir}/scriptbuilder/gui/application.properties">
+        <entry key="Application.buildnumber" value="1" type="int" operation="+"/>
+    </propertyfile>
+</target>
     <!--
 
-    There exist several targets which are by default empty and which can be 
-    used for execution of your tasks. These targets are usually executed 
-    before and after some main targets. They are: 
+    There exist several targets which are by default empty and which can be
+    used for execution of your tasks. These targets are usually executed
+    before and after some main targets. They are:
 
       -pre-init:                 called before initialization of project properties
@@ -41,10 +66,10 @@
         </target>
 
-    For list of available properties check the imported 
-    nbproject/build-impl.xml file. 
+    For list of available properties check the imported
+    nbproject/build-impl.xml file.
 
 
     Another way to customize the build is by overriding existing main targets.
-    The targets of interest are: 
+    The targets of interest are:
 
       -init-macrodef-javac:     defines macro for javac compilation
@@ -53,5 +78,5 @@
       -init-macrodef-java:      defines macro for class execution
       -do-jar:                  JAR building
-      run:                      execution of project 
+      run:                      execution of project
       -javadoc-build:           Javadoc generation
       test-report:              JUnit report generation
@@ -65,8 +90,8 @@
         </target>
 
-    Notice that the overridden target depends on the jar target and not only on 
-    the compile target as the regular run target does. Again, for a list of available 
+    Notice that the overridden target depends on the jar target and not only on
+    the compile target as the regular run target does. Again, for a list of available
     properties which you can use, check the target you are overriding in the
-    nbproject/build-impl.xml file. 
+    nbproject/build-impl.xml file.
 
     -->
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
-
 }
Index: trunk/src/scriptbuilder/gui/ScriptBuilderFrame.form
===================================================================
--- trunk/src/scriptbuilder/gui/ScriptBuilderFrame.form	(revision 1)
+++ trunk/src/scriptbuilder/gui/ScriptBuilderFrame.form	(revision 8)
@@ -838,4 +838,7 @@
                 <Property name="text" type="java.lang.String" value="About..."/>
               </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="helpAboutActionPerformed"/>
+              </Events>
             </MenuItem>
           </SubComponents>
@@ -1086,5 +1089,5 @@
                           <Component id="incidentTimelinePanel10" alignment="0" min="-2" max="-2" attributes="0"/>
                       </Group>
-                      <EmptySpace pref="252" max="32767" attributes="0"/>
+                      <EmptySpace pref="251" max="32767" attributes="0"/>
                   </Group>
               </Group>
@@ -1232,5 +1235,5 @@
                 <DimensionLayout dim="0">
                   <Group type="103" groupAlignment="0" attributes="0">
-                      <EmptySpace min="0" pref="6884" max="32767" attributes="0"/>
+                      <EmptySpace min="0" pref="6882" max="32767" attributes="0"/>
                   </Group>
                 </DimensionLayout>
@@ -2124,5 +2127,5 @@
             <DimensionLayout dim="0">
               <Group type="103" groupAlignment="0" attributes="0">
-                  <EmptySpace min="0" pref="1008" max="32767" attributes="0"/>
+                  <EmptySpace min="0" pref="1032" max="32767" attributes="0"/>
               </Group>
             </DimensionLayout>
Index: trunk/src/scriptbuilder/gui/application.properties
===================================================================
--- trunk/src/scriptbuilder/gui/application.properties	(revision 8)
+++ trunk/src/scriptbuilder/gui/application.properties	(revision 8)
@@ -0,0 +1,5 @@
+#Tue, 25 Jul 2017 14:23:40 -0800
+
+Application.revision=7
+
+Application.buildnumber=2
