LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  March 2015

HPS-SVN March 2015

Subject:

r2237 - in /java/branches/monitoring-app-HPSJAVA-442: ./ src/main/java/org/hps/monitoring/application/ src/main/java/org/hps/monitoring/application/model/ src/main/java/org/hps/monitoring/application/util/ src/main/resources/monitoringButtonGraphics/

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Wed, 4 Mar 2015 03:46:40 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (3946 lines)

Author: [log in to unmask]
Date: Tue Mar  3 19:46:30 2015
New Revision: 2237

Log:
Work in progress on monitoring-app branch.

Added:
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AddActionListener.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventProcessing.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConnectionStatusModel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/util/ResourceUtil.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/resources/monitoringButtonGraphics/
    java/branches/monitoring-app-HPSJAVA-442/src/main/resources/monitoringButtonGraphics/connected-128.png   (with props)
    java/branches/monitoring-app-HPSJAVA-442/src/main/resources/monitoringButtonGraphics/disconnected-128.png   (with props)
Removed:
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringActionListener.java
Modified:
    java/branches/monitoring-app-HPSJAVA-442/pom.xml
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AbstractFieldsPanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/Commands.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionSettingsPanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatus.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatusPanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourcePanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventButtonsPanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/LogTable.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MenuBar.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/RunPanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsDialog.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsPanel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/AbstractModel.java
    java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java

Modified: java/branches/monitoring-app-HPSJAVA-442/pom.xml
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/pom.xml	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/pom.xml	Tue Mar  3 19:46:30 2015
@@ -117,5 +117,10 @@
             <groupId>org.reflections</groupId>
             <artifactId>reflections</artifactId>
         </dependency>
+        <dependency>
+            <groupId>javax.jlfgr</groupId>
+            <artifactId>jlfgr</artifactId>
+            <version>1.0</version>
+        </dependency>
     </dependencies>
 </project>

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AbstractFieldsPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AbstractFieldsPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AbstractFieldsPanel.java	Tue Mar  3 19:46:30 2015
@@ -1,22 +1,22 @@
 package org.hps.monitoring.application;
 
 import java.awt.Color;
-import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
 import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JFormattedTextField;
-import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
+import org.hps.monitoring.application.model.ConfigurationModel;
 import org.hps.monitoring.application.model.HasConfigurationModel;
 
 /**
@@ -25,18 +25,20 @@
  * for layout.
  */
 // TODO: This should use features of JFormattedTextField instead of plain JTextField.
-abstract class AbstractFieldsPanel extends JPanel implements PropertyChangeListener, HasConfigurationModel, ActionListener {
+abstract class AbstractFieldsPanel extends JPanel implements PropertyChangeListener, HasConfigurationModel, ActionListener, AddActionListener {
 
     private int currY = 0;
     private Insets insets;
     private boolean editable = false;
+    
+    protected ConfigurationModel configurationModel;
 
     /**
      * Class constructor.
      * @param insets The insets for the panel.
      * @param editable Editable setting.
      */
-    AbstractFieldsPanel(Insets insets, boolean editable) {
+    protected AbstractFieldsPanel(Insets insets, boolean editable) {
         this.insets = insets;
         this.editable = editable;
     }
@@ -44,7 +46,7 @@
     /**
      * Class constructor.
      */
-    AbstractFieldsPanel() {
+    protected AbstractFieldsPanel() {
         this.insets = new Insets(1, 1, 1, 1);
     }
 
@@ -255,6 +257,36 @@
      * sub-components should attach this to individual components.
      * @param listener The AcitonListener to add.
      */
-    void addActionListener(ActionListener listener) {
-    }
+    @Override
+    public void addActionListener(ActionListener listener) {
+        // Sub-classes should add the listener to the appropriate child components.
+    }
+    
+    /**
+     * Sub-classes should override this method to add their own listeners to update from the model.
+     */
+    @Override
+    public void setConfigurationModel(ConfigurationModel model) {
+        this.configurationModel = model;
+        
+        // This listener is used to push GUI values into the model.
+        this.configurationModel.addPropertyChangeListener(this);
+    }        
+    
+    @Override
+    public ConfigurationModel getConfigurationModel() {
+        return configurationModel;
+    }
+    
+    boolean accept(PropertyChangeEvent evt) {
+        if (evt.getPropertyName().equals("ancestor")) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+    
+    @Override
+    public void propertyChange(PropertyChangeEvent evt) {        
+    }    
 }

Added: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AddActionListener.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AddActionListener.java	(added)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/AddActionListener.java	Tue Mar  3 19:46:30 2015
@@ -0,0 +1,8 @@
+package org.hps.monitoring.application;
+
+import java.awt.event.ActionListener;
+
+public interface AddActionListener {
+
+    void addActionListener(ActionListener listener);
+}

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/Commands.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/Commands.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/Commands.java	Tue Mar  3 19:46:30 2015
@@ -6,12 +6,21 @@
  */
 public final class Commands {
 
+    static final String SETTINGS_LOAD = "settingsLoad";
+    static final String SETTINGS_LOAD_DEFAULT = "settingsLoadDefault";
+    static final String SETTINGS_SAVE = "settingsSave";
+    static final String SETTINGS_SHOW = "settingsShow";
+    static final String OPEN_FILE = "openFile";
+    
+
+    ////////////////////////////////////////////
+    
     static final String AIDA_AUTO_SAVE = "aidaAutoSave";
     static final String AIDA_AUTO_SAVE_CHANGED = "aidaAutoSaveChanged";
     static final String BLOCKING_CHANGED = "blockingChanged";
     static final String CHOOSE_COMPACT_FILE = "chooseCompactFile";
     static final String CHOOSE_LOG_FILE = "chooseLogFile";
-    static final String CHOOSE_FILE_SOURCE = "chooseFileSource";
+    
     static final String CHOOSE_STEERING_FILE = "chooseSteeringFile";
     static final String CONNECT = "connect";
     static final String CLEAR_LOG_TABLE = "clearLogTable";
@@ -24,7 +33,7 @@
     static final String EVENT_BUILDER_CHANGED = "eventBuilderChanged";
     static final String EXIT = "exit";
     static final String FREEZE_CONDITIONS_CHANGED = "freezeConditionsChanged";
-    static final String LOAD_DEFAULT_CONFIG_FILE = "loadDefaultConfigFile";
+    
     static final String LOG_LEVEL_CHANGED = "logLevelChanged";
     static final String LOG_TO_FILE = "logToFile";
     static final String LOG_TO_FILE_CHANGED = "logToFileChanged";
@@ -35,15 +44,15 @@
     static final String RESET_PLOTS = "resetPlots";
     static final String RESTORE_DEFAULT_GUI_LAYOUT = "restoreDefaultGuiLayout";
     static final String RESUME = "resume";
-    static final String SAVE_CONFIG_FILE = "saveConfigFile";
+    
     static final String SAVE_LAYOUT = "saveLayout";
     static final String SAVE_LOG_TABLE = "saveLogTable";
     static final String SAVE_PLOTS = "savePlots";
     static final String SCREENSHOT = "screenshot";
-    static final String SELECT_CONFIG_FILE = "selectConfigFile";
+    
     static final String SELECT_LOG_FILE = "logToFile";
     static final String SET_STEERING_RESOURCE = "setSteeringResource";
-    static final String SHOW_SETTINGS = "showSettings";
+    
     static final String STEERING_TYPE_CHANGED = "steeringTypeChanged";
     static final String STEERING_RESOURCE_CHANGED = "steeringResourceChanged";
     static final String USER_RUN_NUMBER_CHANGED = "userRunNumberChanged";

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionSettingsPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionSettingsPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionSettingsPanel.java	Tue Mar  3 19:46:30 2015
@@ -1,11 +1,25 @@
 package org.hps.monitoring.application;
 
-import static org.hps.monitoring.application.Commands.*;
-import static org.hps.monitoring.application.model.ConfigurationModel.*;
+import static org.hps.monitoring.application.Commands.BLOCKING_CHANGED;
+import static org.hps.monitoring.application.Commands.VERBOSE_CHANGED;
+import static org.hps.monitoring.application.Commands.WAIT_MODE_CHANGED;
+import static org.hps.monitoring.application.model.ConfigurationModel.BLOCKING_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.CHUNK_SIZE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.ET_NAME_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.HOST_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.PORT_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.PRESCALE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.QUEUE_SIZE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.STATION_NAME_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.STATION_POSITION_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.VERBOSE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.WAIT_MODE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.WAIT_TIME_PROPERTY;
 
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 
@@ -34,9 +48,11 @@
     private JTextField waitTimeField;
     private JTextField prescaleField;
 
-    static final String[] waitModes = { Mode.SLEEP.name(), Mode.TIMED.name(), Mode.ASYNC.name() };
-
-    ConfigurationModel configurationModel;
+    static final String[] waitModes = { 
+        Mode.SLEEP.name(), 
+        Mode.TIMED.name(), 
+        Mode.ASYNC.name() 
+    };
 
     /**
      * Class constructor.
@@ -44,7 +60,7 @@
     ConnectionSettingsPanel() {
 
         super(new Insets(5, 5, 5, 5), true);
-
+                        
         setLayout(new GridBagLayout());
 
         etNameField = addField("ET Name", "", 20);
@@ -109,12 +125,19 @@
     /**
      * Updates the GUI from changes in the ConfigurationModel.
      */
-    public class ConfigurationSettingsChangeListener implements PropertyChangeListener {
+    public class ConnectionSettingsChangeListener implements PropertyChangeListener {
         @Override
         public void propertyChange(PropertyChangeEvent evt) {
 
+            System.out.println("ConnectionSettingsChangeListener.propertyChange");
+            System.out.println("  src: " + evt.getSource());
+            System.out.println("  propName: " + evt.getPropertyName());
+            System.out.println("  oldValue: " + evt.getOldValue());
+            System.out.println("  newValue: " + evt.getNewValue());
+            System.out.println("  newValue: " + evt.getPropagationId());
+            
+            //if (evt.getSource() instanceof ConfigurationModel) {
             Object value = evt.getNewValue();
-
             if (evt.getPropertyName().equals(ET_NAME_PROPERTY)) {
                 etNameField.setText((String) value);
             } else if (evt.getPropertyName().equals(HOST_PROPERTY)) {
@@ -148,30 +171,42 @@
      */
     @Override
     public void propertyChange(PropertyChangeEvent evt) {
-
-        if (evt.getPropertyName().equals("ancestor"))
+        
+        if (!accept(evt)) {
             return;
-
+        }
+        
+        System.out.println("ConnectionSettingsPanel.propertyChange");
+        System.out.println("  src: " + evt.getSource());
+        System.out.println("  propName: " + evt.getPropertyName());
+        System.out.println("  oldValue: " + evt.getOldValue());
+        System.out.println("  newValue: " + evt.getNewValue());
+        System.out.println("  propValue: " + evt.getPropagationId());
+        
         Object source = evt.getSource();
-
-        if (source.equals(etNameField)) {
-            configurationModel.setEtName(etNameField.getText());
-        } else if (source.equals(hostField)) {
-            configurationModel.setHost(hostField.getText());
-        } else if (source.equals(portField)) {
-            configurationModel.setPort(Integer.parseInt(portField.getText()));
-        } else if (source.equals(stationNameField)) {
-            configurationModel.setStationName(stationNameField.getText());
-        } else if (source.equals(chunkSizeField)) {
-            configurationModel.setChunkSize(Integer.parseInt(chunkSizeField.getText()));
-        } else if (source.equals(queueSizeField)) {
-            configurationModel.setQueueSize(Integer.parseInt(queueSizeField.getText()));
-        } else if (source.equals(stationPositionField)) {
-            configurationModel.setStationPosition(Integer.parseInt(stationPositionField.getText()));
-        } else if (source.equals(waitTimeField)) {
-            configurationModel.setWaitTime(Integer.parseInt(waitTimeField.getText()));
-        } else if (source.equals(prescaleField)) {
-            configurationModel.setPrescale(Integer.parseInt(prescaleField.getText()));
+        configurationModel.removePropertyChangeListener(this);
+        try {
+            if (source.equals(etNameField)) {
+                configurationModel.setEtName(etNameField.getText());
+            } else if (source.equals(hostField)) {
+                configurationModel.setHost(hostField.getText());
+            } else if (source.equals(portField)) {
+                configurationModel.setPort(Integer.parseInt(portField.getText()));
+            } else if (source.equals(stationNameField)) {
+                configurationModel.setStationName(stationNameField.getText());
+            } else if (source.equals(chunkSizeField)) {
+                configurationModel.setChunkSize(Integer.parseInt(chunkSizeField.getText()));
+            } else if (source.equals(queueSizeField)) {
+                configurationModel.setQueueSize(Integer.parseInt(queueSizeField.getText()));
+            } else if (source.equals(stationPositionField)) {
+                configurationModel.setStationPosition(Integer.parseInt(stationPositionField.getText()));
+            } else if (source.equals(waitTimeField)) {
+                configurationModel.setWaitTime(Integer.parseInt(waitTimeField.getText()));
+            } else if (source.equals(prescaleField)) {
+                configurationModel.setPrescale(Integer.parseInt(prescaleField.getText()));
+            }
+        } finally {
+            configurationModel.addPropertyChangeListener(this);
         }
     }
 
@@ -188,21 +223,11 @@
             configurationModel.setVerbose(verboseCheckBox.isSelected());
         }
     }
-
-    @Override
-    public void setConfigurationModel(ConfigurationModel configurationModel) {
-        // Set the ConfigurationModel reference.
-        this.configurationModel = configurationModel;
-
-        // This listener pushes GUI values into the configuration.
-        this.configurationModel.addPropertyChangeListener(this);
-
+    
+    public void setConfigurationModel(ConfigurationModel model) {
+        super.setConfigurationModel(model);
+        
         // This listener updates the GUI from changes in the configuration.
-        this.configurationModel.addPropertyChangeListener(new ConfigurationSettingsChangeListener());
-    }
-
-    @Override
-    public ConfigurationModel getConfigurationModel() {
-        return configurationModel;
+        this.configurationModel.addPropertyChangeListener(new ConnectionSettingsChangeListener());
     }
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatus.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatus.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatus.java	Tue Mar  3 19:46:30 2015
@@ -1,14 +1,22 @@
 package org.hps.monitoring.application;
+
+import java.awt.Color;
 
 /**
  * Status of the connection to the ET server from the monitoring client.
  */
-// FIXME: Just change to disconnected and connected.
 public enum ConnectionStatus {
-    DISCONNECTED,
-    DISCONNECTING,
-    ERROR,
-    CONNECTION_REQUESTED,
-    CONNECTED,
-    PAUSED
+
+    DISCONNECTED(Color.RED),
+    CONNECTED(Color.GREEN);
+    
+    Color color;    
+    
+    ConnectionStatus(Color color) {
+        this.color = color;
+    }
+    
+    Color getColor() {
+        return color;
+    }
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatusPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatusPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/ConnectionStatusPanel.java	Tue Mar  3 19:46:30 2015
@@ -6,20 +6,22 @@
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JSeparator;
 import javax.swing.JTextField;
-import javax.swing.SwingConstants;
 import javax.swing.SwingUtilities;
+
+import org.hps.monitoring.application.model.ConnectionStatusModel;
 
 /**
  * This is the panel for showing the current connection status (connected, disconnected, etc.).
  */
-class ConnectionStatusPanel extends JPanel {
+class ConnectionStatusPanel extends JPanel implements PropertyChangeListener {
 
     JTextField statusField;
     JTextField dateField;
@@ -29,11 +31,16 @@
 
     private static final int PANEL_HEIGHT = 50;
     private static final int PANEL_WIDTH = 400;
+    
+    ConnectionStatusModel model;
 
     /**
      * Class constructor.
      */
-    ConnectionStatusPanel() {
+    ConnectionStatusPanel(ConnectionStatusModel model) {
+        
+        this.model = model;
+        this.model.addPropertyChangeListener(this);
 
         setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
 
@@ -43,13 +50,6 @@
 
         GridBagConstraints c = new GridBagConstraints();
         c.weightx = c.weighty = 1.0;
-
-        // Bottom separator.
-        c.gridx = 0;
-        c.gridy = 0;
-        c.fill = GridBagConstraints.HORIZONTAL;
-        c.gridwidth = GridBagConstraints.REMAINDER;
-        add(new JSeparator(SwingConstants.HORIZONTAL), c);
 
         // Connection status label.
         c = new GridBagConstraints();
@@ -96,15 +96,6 @@
         dateField.setFont(font);
         dateField.setMinimumSize(new Dimension(200, 50));
         add(dateField, c);
-
-        // Bottom separator.
-        c = new GridBagConstraints();
-        c.gridx = 0;
-        c.gridy = 2;
-        c.fill = GridBagConstraints.HORIZONTAL;
-        c.gridwidth = GridBagConstraints.REMAINDER;
-        c.insets = new Insets(10, 0, 0, 0);
-        add(new JSeparator(SwingConstants.HORIZONTAL), c);
     }
 
     void setConnectionStatus(final ConnectionStatus status) {
@@ -115,4 +106,17 @@
             }
         });
     }
+
+    @Override
+    public void propertyChange(PropertyChangeEvent evt) {
+        if (evt.getPropertyName().equals(ConnectionStatusModel.CONNECTION_STATUS_PROPERTY)) {
+            final ConnectionStatus status = (ConnectionStatus) evt.getNewValue();
+            SwingUtilities.invokeLater(new Runnable() {
+                public void run() {
+                    statusField.setText(status.name());
+                    dateField.setText(dateFormat.format(new Date()));
+                }
+            }); 
+        }        
+    }
 }

Added: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java	(added)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java	Tue Mar  3 19:46:30 2015
@@ -0,0 +1,44 @@
+package org.hps.monitoring.application;
+
+import java.awt.Dimension;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import javax.swing.JComboBox;
+
+import org.hps.monitoring.application.DataSourceComboBox.DataSourceItem;
+import org.hps.record.enums.DataSourceType;
+
+/**
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ *
+ */
+public class DataSourceComboBox extends JComboBox<DataSourceItem> {
+
+    DataSourceComboBox(ActionListener listener) {
+        addActionListener(listener);
+        setPreferredSize(new Dimension(400, this.getPreferredSize().height));        
+    }
+    
+    static class DataSourceItem {
+        
+        File file;
+        String name;
+        DataSourceType type;
+        
+        DataSourceItem(String name, DataSourceType type) {
+            this.type = type;
+        }
+        
+        DataSourceItem(File file, DataSourceType type) {
+            this.file = file;
+            this.name = file.getName();
+            this.file = file;
+        }
+
+        public String toString() {
+            return name;
+        }        
+    }         
+}

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourcePanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourcePanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/DataSourcePanel.java	Tue Mar  3 19:46:30 2015
@@ -1,6 +1,6 @@
 package org.hps.monitoring.application;
 
-import static org.hps.monitoring.application.Commands.CHOOSE_FILE_SOURCE;
+import static org.hps.monitoring.application.Commands.OPEN_FILE;
 import static org.hps.monitoring.application.Commands.DATA_SOURCE_TYPE_CHANGED;
 import static org.hps.monitoring.application.Commands.PROCESSING_STAGE_CHANGED;
 import static org.hps.monitoring.application.Commands.VALIDATE_DATA_FILE;
@@ -32,9 +32,17 @@
  */
 class DataSourcePanel extends AbstractFieldsPanel {
 
-    static final String[] dataSourceTypes = { DataSourceType.ET_SERVER.description(), DataSourceType.EVIO_FILE.description(), DataSourceType.LCIO_FILE.description() };
-
-    static final String[] processingStages = { ProcessingStage.ET.name(), ProcessingStage.EVIO.name(), ProcessingStage.LCIO.name() };
+    static final String[] dataSourceTypes = { 
+        DataSourceType.ET_SERVER.description(), 
+        DataSourceType.EVIO_FILE.description(), 
+        DataSourceType.LCIO_FILE.description() 
+    };
+    
+    static final String[] processingStages = { 
+        ProcessingStage.ET.name(), 
+        ProcessingStage.EVIO.name(), 
+        ProcessingStage.LCIO.name() 
+    };
 
     JComboBox<?> dataSourceTypeComboBox;
     JTextField dataSourcePathField;
@@ -42,11 +50,10 @@
     JButton validateDataFileButton;
     JComboBox<?> processingStageComboBox;
 
-    ConfigurationModel configurationModel;
-
     DataSourcePanel() {
+        
         setLayout(new GridBagLayout());
-
+        
         dataSourceTypeComboBox = addComboBox("Data Source", dataSourceTypes);
         dataSourceTypeComboBox.setSelectedIndex(0);
         dataSourceTypeComboBox.setActionCommand(DATA_SOURCE_TYPE_CHANGED);
@@ -56,7 +63,7 @@
         dataSourcePathField.addPropertyChangeListener(this);
 
         fileSourceButton = addButton("Select data file");
-        fileSourceButton.setActionCommand(CHOOSE_FILE_SOURCE);
+        fileSourceButton.setActionCommand(OPEN_FILE);
         fileSourceButton.addActionListener(this);
 
         validateDataFileButton = addButton("Validate data file");
@@ -121,38 +128,28 @@
             }
         }
     }
-
-    @Override
-    public void setConfigurationModel(ConfigurationModel configurationModel) {
-        this.configurationModel = configurationModel;
-
-        // This listener pushes GUI values into the configuration.
-        this.configurationModel.addPropertyChangeListener(this);
-
-        // This listener updates the GUI from changes in the configuration.
-        this.configurationModel.addPropertyChangeListener(new DataSourceChangeListener());
-    }
-
-    @Override
-    public ConfigurationModel getConfigurationModel() {
-        return configurationModel;
-    }
-
-    @Override
+    
+    /**
+     * 
+     * @param e
+     */
+    @Override   
     public void actionPerformed(ActionEvent e) {
-        if (DATA_SOURCE_TYPE_CHANGED.equals(e.getActionCommand())) {
-            DataSourceType dataSourceType = DataSourceType.values()[dataSourceTypeComboBox.getSelectedIndex()];
-            configurationModel.setDataSourceType(dataSourceType);
-            validateDataFileButton.setEnabled(dataSourceType.isFile());
-        } else if (PROCESSING_STAGE_CHANGED.equals(e.getActionCommand())) {
-            ProcessingStage processingStage = ProcessingStage.values()[processingStageComboBox.getSelectedIndex()];
-            configurationModel.setProcessingStage(processingStage);
-        } else if (CHOOSE_FILE_SOURCE.equals(e.getActionCommand())) {
-            chooseDataFile();
+        try {
+            configurationModel.removePropertyChangeListener(this);
+            if (DATA_SOURCE_TYPE_CHANGED.equals(e.getActionCommand())) {
+                DataSourceType dataSourceType = DataSourceType.values()[dataSourceTypeComboBox.getSelectedIndex()];
+                configurationModel.setDataSourceType(dataSourceType);
+                validateDataFileButton.setEnabled(dataSourceType.isFile());
+            } else if (PROCESSING_STAGE_CHANGED.equals(e.getActionCommand())) {
+                ProcessingStage processingStage = ProcessingStage.values()[processingStageComboBox.getSelectedIndex()];
+                configurationModel.setProcessingStage(processingStage);
+            } else if (OPEN_FILE.equals(e.getActionCommand())) {
+                chooseDataFile();
+            }
+        } finally {
+            configurationModel.addPropertyChangeListener(this);
         }
-    }
-
-    public void propertyChange(PropertyChangeEvent evt) {
     }
 
     /**
@@ -165,12 +162,17 @@
             if (evt.getPropertyName().equals("ancestor"))
                 return;
             Object value = evt.getNewValue();
-            if (DATA_SOURCE_TYPE_PROPERTY.equals(evt.getPropertyName())) {
-                dataSourceTypeComboBox.setSelectedIndex(((DataSourceType) evt.getNewValue()).ordinal());
-            } else if (DATA_SOURCE_PATH_PROPERTY.equals(evt.getPropertyName())) {
-                dataSourcePathField.setText((String) value);
-            } else if (PROCESSING_STAGE_PROPERTY.equals(evt.getPropertyName())) {
-                processingStageComboBox.setSelectedItem(value.toString());
+            configurationModel.removePropertyChangeListener(this);
+            try {
+                if (DATA_SOURCE_TYPE_PROPERTY.equals(evt.getPropertyName())) {
+                    dataSourceTypeComboBox.setSelectedIndex(((DataSourceType) evt.getNewValue()).ordinal());
+                } else if (DATA_SOURCE_PATH_PROPERTY.equals(evt.getPropertyName())) {
+                    dataSourcePathField.setText((String) value);
+                } else if (PROCESSING_STAGE_PROPERTY.equals(evt.getPropertyName())) {
+                    processingStageComboBox.setSelectedItem(value.toString());
+                }
+            } finally {
+                configurationModel.addPropertyChangeListener(this);
             }
         }
     }
@@ -179,4 +181,11 @@
         // Hook the validate button to the main app where that task actually executes.
         validateDataFileButton.addActionListener(listener);
     }
+    
+    @Override
+    public void setConfigurationModel(ConfigurationModel model) {
+        super.setConfigurationModel(model);
+        
+        model.addPropertyChangeListener(new DataSourceChangeListener());
+    }
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventButtonsPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventButtonsPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventButtonsPanel.java	Tue Mar  3 19:46:30 2015
@@ -1,110 +1,111 @@
 package org.hps.monitoring.application;
 
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
+import java.awt.FlowLayout;
+import java.awt.Image;
 import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.IOException;
 
+import javax.imageio.ImageIO;
+import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+
+import org.hps.monitoring.application.model.ConnectionStatusModel;
 
 /**
  * This is the panel with buttons for connecting or disconnecting and controlling the app from pause
  * mode.
  */
-class EventButtonsPanel extends JPanel {
+class EventButtonsPanel extends JPanel implements PropertyChangeListener {
 
-    JButton nextEventsButton;
+    JButton nextButton;
     JButton pauseButton;
     JButton connectButton;
-
-    /**
-     * Class constructor.
-     */
-    EventButtonsPanel() {
-
-        GridBagLayout layout = new GridBagLayout();
-        setLayout(layout);
-
-        GridBagConstraints c = new GridBagConstraints();
-        c.gridx = 0;
-        c.gridy = 0;
-        c.insets = new Insets(0, 0, 0, 10);
-        connectButton = new JButton("Connect");
-        connectButton.setEnabled(true);
-        connectButton.setActionCommand(Commands.CONNECT);
-        add(connectButton, c);
-
-        c = new GridBagConstraints();
-        c.gridx = 1;
-        c.gridy = 0;
-        c.insets = new Insets(0, 0, 0, 10);
-        pauseButton = new JButton("Pause");
-        pauseButton.setActionCommand(Commands.PAUSE);
-        pauseButton.setEnabled(false);
-        add(pauseButton, c);
-
-        c = new GridBagConstraints();
-        c.gridx = 2;
-        c.gridy = 0;
-        nextEventsButton = new JButton("Next Event");
-        nextEventsButton.setEnabled(false);
-        nextEventsButton.setActionCommand(Commands.NEXT);
-        add(nextEventsButton, c);
+    JButton resumeButton;
+    
+    static final ImageIcon connectedIcon = getImageIcon("/monitoringButtonGraphics/connected-128.png");
+    static final ImageIcon disconnectedIcon = getImageIcon("/monitoringButtonGraphics/disconnected-128.png");
+    
+    EventButtonsPanel(ConnectionStatusModel connectionModel, ActionListener listener) {
+        
+        connectionModel.addPropertyChangeListener(this);
+        
+        setLayout(new FlowLayout());
+        connectButton = addButton(disconnectedIcon, Commands.CONNECT, listener, true);
+        resumeButton = addButton("/toolbarButtonGraphics/media/Play24.gif", Commands.RESUME, listener, false);
+        pauseButton = addButton("/toolbarButtonGraphics/media/Pause24.gif", Commands.PAUSE, listener, false);
+        nextButton = addButton("/toolbarButtonGraphics/media/StepForward24.gif", Commands.NEXT, listener, false);
+    }
+           
+    final JButton addButton(ImageIcon icon, String command, ActionListener listener, boolean enabled) {
+        JButton button = new JButton();
+        button.setIcon(icon);
+        button.setEnabled(enabled);
+        button.addActionListener(listener);
+        button.setActionCommand(command);
+        this.add(button);
+        return button;
+    }
+    
+    final JButton addButton(String resource, String actionCommand, ActionListener listener, boolean enabled) {
+        return addButton(getImageIcon(resource), actionCommand, listener, enabled);
+    }
+        
+    static ImageIcon getImageIcon(String resource) {
+        Image image = null;
+        try {
+            image = ImageIO.read(EventButtonsPanel.class.getResource(resource));
+            image = image.getScaledInstance(24, 24, 0);
+        } catch (IOException e) {            
+        }
+        return new ImageIcon(image);
     }
 
-    /**
-     * Set the application connection state.
-     * @param connected True if application is connected or false if disconnected.
-     */
-    void setConnected(boolean connected) {
-        if (connected) {
-            connectButton.setText("Disconnect");
-            connectButton.setActionCommand(Commands.DISCONNECT);
-        } else {
-            connectButton.setText("Connect");
-            connectButton.setActionCommand(Commands.CONNECT);
+    @Override
+    public void propertyChange(final PropertyChangeEvent evt) {
+        if (evt.getPropertyName().equals(ConnectionStatusModel.CONNECTION_STATUS_PROPERTY)) {
+            SwingUtilities.invokeLater(new Runnable() {
+                public void run() {
+                    setConnectionStatus((ConnectionStatus) evt.getNewValue());
+                }
+            });
+        } else if (evt.getPropertyName().equals(ConnectionStatusModel.PAUSED_PROPERTY)) {
+            SwingUtilities.invokeLater(new Runnable() {
+                public void run() {
+                    setPaused((boolean) evt.getNewValue());
+                }
+            });
         }
     }
-
-    /**
-     * Add an ActionListener to this component.
-     * @param listener The ActionListener.
-     */
-    void addActionListener(ActionListener listener) {
-        nextEventsButton.addActionListener(listener);
-        pauseButton.addActionListener(listener);
-        connectButton.addActionListener(listener);
-    }
-
-    /**
-     * Eanble the pause button.
-     * @param e Set to true to enable the pause button; false to disable.
-     */
-    void enablePauseButton(boolean e) {
-        this.pauseButton.setEnabled(e);
-    }
-
-    /**
-     * Enable the "next events" button.
-     * @param e Set to true to enable; false to disable.
-     */
-    void enableNextEventsButton(boolean e) {
-        this.nextEventsButton.setEnabled(e);
-    }
-
-    /**
-     * Set the pause mode state.
-     * @param enable Set to true to enable pause mode; false to disable.
-     */
-    void setPauseModeState(boolean enable) {
-        this.nextEventsButton.setEnabled(enable);
-        if (enable) {
-            pauseButton.setText("Resume");
-            pauseButton.setActionCommand(Commands.RESUME);
-        } else {
-            pauseButton.setText("Pause");
-            pauseButton.setActionCommand(Commands.PAUSE);
-        }
+    
+    void setConnectionStatus(final ConnectionStatus status) {
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                if (status.equals(ConnectionStatus.DISCONNECTED)) {
+                    nextButton.setEnabled(false);
+                    pauseButton.setEnabled(false);
+                    resumeButton.setEnabled(false);
+                    connectButton.setActionCommand(Commands.CONNECT);
+                    connectButton.setIcon(disconnectedIcon);
+                } else {
+                    pauseButton.setEnabled(true);
+                    connectButton.setActionCommand(Commands.DISCONNECT);
+                    connectButton.setIcon(connectedIcon);
+                }
+            }
+        });
+    }       
+    
+    void setPaused(final boolean paused) {
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                resumeButton.setEnabled(paused);
+                pauseButton.setEnabled(!paused);
+                nextButton.setEnabled(paused);
+            }
+        });
     }
 }

Added: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventProcessing.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventProcessing.java	(added)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/EventProcessing.java	Tue Mar  3 19:46:30 2015
@@ -0,0 +1,245 @@
+package org.hps.monitoring.application;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Logger;
+
+import org.freehep.record.loop.RecordLoop.Command;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.job.JobManager;
+import org.hps.monitoring.application.model.ConfigurationModel;
+import org.hps.monitoring.application.util.ErrorHandler;
+import org.hps.monitoring.subsys.et.EtSystemMonitor;
+import org.hps.monitoring.subsys.et.EtSystemStripCharts;
+import org.hps.record.LCSimEventBuilder;
+import org.hps.record.composite.CompositeLoop;
+import org.hps.record.composite.CompositeLoopConfiguration;
+import org.hps.record.composite.EventProcessingThread;
+import org.hps.record.enums.DataSourceType;
+import org.hps.record.evio.EvioDetectorConditionsProcessor;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.conditions.ConditionsReader;
+import org.lcsim.util.Driver;
+
+/**
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ *
+ */
+public class EventProcessing {
+    
+    SessionState state;
+    ErrorHandler errorHandler;
+    Logger logger;
+    
+    EventProcessing(SessionState state, Logger logger, ErrorHandler errorHandler) {
+        this.state = state;
+        this.logger = logger;        
+        this.errorHandler = errorHandler;        
+    }
+
+    void setup(ConfigurationModel configurationModel) {
+        logger.info("setting up LCSim");
+
+        // Get steering resource or file as a String parameter.
+        String steering = null;
+        SteeringType steeringType = configurationModel.getSteeringType();
+        if (steeringType.equals(SteeringType.FILE))
+            try {
+                steering = configurationModel.getSteeringFile().getCanonicalPath();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        else
+            steering = configurationModel.getSteeringResource();
+
+        logger.config("Set steering to " + steering + " with type " + (steeringType == SteeringType.RESOURCE ? "RESOURCE" : "FILE"));
+
+        try {
+            // Create and the job manager.  The conditions manager is instantiated from this call but not configured.
+            state.jobManager = new JobManager();
+            
+            if (configurationModel.hasValidProperty(ConfigurationModel.DETECTOR_ALIAS_PROPERTY)) {
+                // Set a detector alias.                
+                ConditionsReader.addAlias(configurationModel.getDetectorName(), "file://" + configurationModel.getDetectorAlias());
+                logger.config("using detector alias " + configurationModel.getDetectorAlias());
+            }
+                        
+            // Setup the event builder to translate from EVIO to LCIO.
+            // This must happen before Driver setup so the builder's listeners are activated first!
+            createEventBuilder(configurationModel);
+            
+            // Configure the job manager for the XML steering.
+            state.jobManager.setPerformDryRun(true);
+            if (steeringType == SteeringType.RESOURCE) {
+                setupSteeringResource(steering);
+            } else if (steeringType.equals(SteeringType.FILE)) {
+                setupSteeringFile(steering);
+            }
+           
+            // Is there a user specified run number from the JobPanel?
+            if (configurationModel.hasValidProperty(ConfigurationModel.USER_RUN_NUMBER_PROPERTY)) {
+                int userRunNumber = configurationModel.getUserRunNumber();
+                String detectorName = configurationModel.getDetectorName();
+                DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+                logger.config("setting user run number " + userRunNumber + " with detector " + detectorName);
+                conditionsManager.setDetector(configurationModel.getDetectorName(), userRunNumber);
+                if (configurationModel.hasPropertyKey(ConfigurationModel.FREEZE_CONDITIONS_PROPERTY)) {
+                    // Freeze the conditions system to ignore run numbers from the events.  
+                    logger.config("user configured to freeze conditions system from monitoring app");
+                    conditionsManager.freeze();
+                } else {
+                    // Allow run numbers to be picked up from the events.
+                    logger.config("user run number specified but conditions system is NOT frozen");
+                    conditionsManager.unfreeze();
+                }
+            }
+
+            logger.info("LCSim setup was successful.");
+
+        } catch (Throwable t) {
+            // Catch all errors and rethrow them as RuntimeExceptions.
+            errorHandler.setError(t).setMessage("Error setting up LCSim.").printStackTrace().raiseException();
+        }
+        
+        // Setup the CompositeLoop.
+        setupLoop(configurationModel);
+    }
+    
+    /**
+     * Create the event builder for converting EVIO events to LCSim.
+     */
+    void createEventBuilder(ConfigurationModel configurationModel) {
+
+        // Get the class for the event builder.
+        String eventBuilderClassName = configurationModel.getEventBuilderClassName();
+
+        //logger.config("initializing event builder: " + eventBuilderClassName);
+
+        try {
+            // Create a new instance of the builder class.
+            state.eventBuilder = (LCSimEventBuilder) Class.forName(eventBuilderClassName).newInstance();
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to create LCSimEventBuilder.", e);
+        }
+
+        // Add the builder as a listener so it is notified when conditions change.
+        ConditionsManager.defaultInstance().addConditionsListener(state.eventBuilder);
+
+        //logger.config("successfully initialized event builder: " + eventBuilderClassName);
+    }
+    
+    void setupLoop(ConfigurationModel configurationModel) {
+
+        CompositeLoopConfiguration loopConfig = new CompositeLoopConfiguration()
+            .setStopOnEndRun(configurationModel.getDisconnectOnEndRun())
+            .setStopOnErrors(configurationModel.getDisconnectOnError())
+            .setDataSourceType(configurationModel.getDataSourceType())
+            .setProcessingStage(configurationModel.getProcessingStage())
+            .setEtConnection(state.connection)
+            .setFilePath(configurationModel.getDataSourcePath())
+            .setLCSimEventBuilder(state.eventBuilder)
+            .setDetectorName(configurationModel.getDetectorName());
+
+        if (configurationModel.hasValidProperty(ConfigurationModel.MAX_EVENTS_PROPERTY)) {
+            long maxEvents = configurationModel.getMaxEvents();
+            if (maxEvents > 0L) {
+                //logger.config("processing will stop after max events: " + maxEvents);
+                loopConfig.setMaxRecords(maxEvents);
+            }
+        }
+        
+        // Add all Drivers from the JobManager.
+        for (Driver driver : state.jobManager.getDriverExecList()) {
+            loopConfig.add(driver);
+        }
+
+        // Using ET server?
+        if (configurationModel.getDataSourceType().equals(DataSourceType.ET_SERVER)) {
+
+            // ET system monitor.
+            loopConfig.add(new EtSystemMonitor());
+
+            // ET system strip charts.
+            loopConfig.add(new EtSystemStripCharts());
+        }
+
+        // FIXME: Do this externally?
+        // RunPanel updater.
+        //loopConfig.add(frame.runPanel.new RunModelUpdater());
+                
+        // Setup for conditions activation via EVIO events.
+        loopConfig.add(new EvioDetectorConditionsProcessor(configurationModel.getDetectorName()));
+
+        // Create the CompositeLoop with the configuration.
+        state.loop = new CompositeLoop(loopConfig);        
+    }    
+    
+    
+    
+    /**
+     * Stop the event processing by executing a <code>STOP</code> command on the record loop and
+     * killing the event processing thread. This is executed after the ET system is disconnected so
+     * that the event processing does not potentially hang in a call to
+     * <code>EtSystem.getEvents()</code> forever.
+     */
+    void stop() {
+
+        // Is the event processing thread not null?
+        if (state.processingThread != null) {
+
+            // Is the event processing thread actually still alive?
+            if (state.processingThread.isAlive()) {
+
+                // Request the event processing loop to execute stop.
+                state.loop.execute(Command.STOP);
+
+                try {
+                    // This should always work, because the ET system is disconnected before this.
+                    state.processingThread.join();
+                } catch (InterruptedException e) {
+                    // Don't know when this would ever happen.
+                    e.printStackTrace();
+                }
+            }
+
+            // Notify of last error that occurred in event processing.
+            if (state.loop.getLastError() != null) {
+                errorHandler.setError(state.loop.getLastError()).log().printStackTrace();
+            }
+
+            // Set the event processing thread to null as it is unusable now.
+            state.processingThread = null;
+        }
+
+        // Set the loop to null as a new one will be created for next session.
+        state.loop = null;
+    }    
+    
+    void setupSteeringFile(String steering) {
+        //logger.config("setting up steering file: " + steering);
+        state.jobManager.setup(new File(steering));
+    }
+
+    void setupSteeringResource(String steering) throws IOException {
+        //logger.config("setting up steering resource: " + steering);
+        InputStream is = this.getClass().getClassLoader().getResourceAsStream(steering);
+        if (is == null)
+            throw new IOException("Steering resource is not accessible or does not exist.");
+        state.jobManager.setup(is);
+        is.close();
+    }
+    
+    void start() {
+        
+        // Create the processing thread.
+        state.processingThread = new EventProcessingThread(state.loop);
+
+        // Start the processing thread.
+        state.processingThread.start();
+    }
+    
+
+    
+}

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java	Tue Mar  3 19:46:30 2015
@@ -1,7 +1,33 @@
 package org.hps.monitoring.application;
 
-import static org.hps.monitoring.application.Commands.*;
-import static org.hps.monitoring.application.model.ConfigurationModel.*;
+import static org.hps.monitoring.application.Commands.AIDA_AUTO_SAVE_CHANGED;
+import static org.hps.monitoring.application.Commands.DETECTOR_ALIAS_CHANGED;
+import static org.hps.monitoring.application.Commands.DETECTOR_NAME_CHANGED;
+import static org.hps.monitoring.application.Commands.DISCONNECT_ON_END_RUN_CHANGED;
+import static org.hps.monitoring.application.Commands.DISCONNECT_ON_ERROR_CHANGED;
+import static org.hps.monitoring.application.Commands.EVENT_BUILDER_CHANGED;
+import static org.hps.monitoring.application.Commands.FREEZE_CONDITIONS_CHANGED;
+import static org.hps.monitoring.application.Commands.LOG_LEVEL_CHANGED;
+import static org.hps.monitoring.application.Commands.LOG_TO_FILE_CHANGED;
+import static org.hps.monitoring.application.Commands.STEERING_RESOURCE_CHANGED;
+import static org.hps.monitoring.application.Commands.STEERING_TYPE_CHANGED;
+import static org.hps.monitoring.application.Commands.USER_RUN_NUMBER_CHANGED;
+import static org.hps.monitoring.application.model.ConfigurationModel.AIDA_AUTO_SAVE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.AIDA_FILE_NAME_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.DETECTOR_ALIAS_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.DETECTOR_NAME_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.DISCONNECT_ON_END_RUN_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.DISCONNECT_ON_ERROR_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.EVENT_BUILDER_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.FREEZE_CONDITIONS_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.LOG_FILE_NAME_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.LOG_LEVEL_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.LOG_TO_FILE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.MAX_EVENTS_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.STEERING_FILE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.STEERING_RESOURCE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.STEERING_TYPE_PROPERTY;
+import static org.hps.monitoring.application.model.ConfigurationModel.USER_RUN_NUMBER_PROPERTY;
 
 import java.awt.GridBagLayout;
 import java.awt.Insets;
@@ -11,18 +37,6 @@
 import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.net.JarURLConnection;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
 import java.util.logging.Level;
 
 import javax.swing.JButton;
@@ -33,12 +47,11 @@
 import javax.swing.filechooser.FileFilter;
 
 import org.hps.monitoring.application.model.ConfigurationModel;
-import org.hps.record.LCSimEventBuilder;
+import org.hps.monitoring.application.util.ResourceUtil;
 import org.jdom.Document;
 import org.jdom.Element;
 import org.jdom.JDOMException;
 import org.jdom.input.SAXBuilder;
-import org.reflections.Reflections;
 
 /**
  * This is the GUI panel for setting job parameters. It is connected to the global configuration via
@@ -66,9 +79,6 @@
     // The package where steering resources must be located.
     static final String STEERING_PACKAGE = "org/hps/steering/monitoring/";
 
-    // This connects the GUI to the global configuration model.
-    ConfigurationModel configurationModel;
-
     // The available LogLevel settings as an array of strings.
     static final String[] LOG_LEVELS = new String[] { 
         Level.ALL.toString(), 
@@ -88,9 +98,10 @@
     JobSettingsPanel() {
 
         super(new Insets(4, 2, 2, 4), true);
+        
         setLayout(new GridBagLayout());
 
-        steeringResourcesComboBox = addComboBoxMultiline("Steering File Resource", findSteeringResources(STEERING_PACKAGE));
+        steeringResourcesComboBox = addComboBoxMultiline("Steering File Resource", ResourceUtil.findSteeringResources(STEERING_PACKAGE));
         steeringResourcesComboBox.setActionCommand(STEERING_RESOURCE_CHANGED);
         steeringResourcesComboBox.addActionListener(this);
         
@@ -105,7 +116,7 @@
         steeringTypeComboBox.setActionCommand(STEERING_TYPE_CHANGED);
         steeringTypeComboBox.addActionListener(this);
         
-        detectorNameComboBox = addComboBox("Detector Name", this.findDetectorNames());
+        detectorNameComboBox = addComboBox("Detector Name", ResourceUtil.findDetectorNames());
         detectorNameComboBox.setActionCommand(DETECTOR_NAME_CHANGED);
         detectorNameComboBox.addActionListener(this);
         
@@ -133,7 +144,7 @@
         maxEventsField.setEnabled(true);
         maxEventsField.setEditable(true);
         
-        eventBuilderComboBox = addComboBox("LCSim Event Builder", this.findEventBuilderClassNames());
+        eventBuilderComboBox = addComboBox("LCSim Event Builder", ResourceUtil.findEventBuilderClassNames());
         eventBuilderComboBox.setSize(24, eventBuilderComboBox.getPreferredSize().height);
         eventBuilderComboBox.setActionCommand(EVENT_BUILDER_CHANGED);
         eventBuilderComboBox.addActionListener(this);
@@ -167,37 +178,14 @@
     }
 
     @Override
-    public void setConfigurationModel(ConfigurationModel configModel) {
-
-        // Set the ConfigurationModel reference.
-        this.configurationModel = configModel;
-
-        // This listener pushes GUI values into the configuration.
-        this.configurationModel.addPropertyChangeListener(this);
-
-        // This listener updates the GUI from changes in the configuration.
-        this.configurationModel.addPropertyChangeListener(new JobSettingsChangeListener());
-    }
-
-    @Override
     public ConfigurationModel getConfigurationModel() {
         return configurationModel;
     }
 
     /**
-     * Enable this component.
-     * @param enable Whether to enable or not.
-     */
-    /*
-     * void enableJobPanel(boolean enable) { detectorNameField.setEnabled(enable);
-     * eventBuilderField.setEnabled(enable); steeringTypeComboBox.setEnabled(enable);
-     * steeringFileField.setEnabled(enable); steeringResourcesComboBox.setEnabled(enable); }
-     */
-
-    /**
      * Attaches the ActionListener from the main app to specific GUI components in this class.
      */
-    void addActionListener(ActionListener listener) {
+    public void addActionListener(ActionListener listener) {
         logFileNameField.addActionListener(listener);
         logToFileCheckbox.addActionListener(listener);
         steeringResourcesComboBox.addActionListener(listener);
@@ -299,37 +287,50 @@
     }
 
     @Override
-    public void actionPerformed(ActionEvent e) {
-        if (e.getActionCommand().equals(Commands.CHOOSE_STEERING_FILE)) {
-            this.chooseSteeringFile();
-        } else if (e.getActionCommand().equals(Commands.CHOOSE_COMPACT_FILE)) {
-            chooseCompactFile();
-        } else if (DISCONNECT_ON_ERROR_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setDisconnectOnError(disconnectOnErrorCheckBox.isSelected());
-        } else if (DISCONNECT_ON_END_RUN_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setDisconnectOnEndRun(disconnectOnEndRunCheckBox.isSelected());
-        } else if (STEERING_TYPE_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setSteeringType(SteeringType.valueOf((String) steeringTypeComboBox.getSelectedItem()));
-        } else if (STEERING_RESOURCE_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setSteeringResource((String) steeringResourcesComboBox.getSelectedItem());
-        } else if (LOG_TO_FILE_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setLogToFile(logToFileCheckbox.isSelected());
-        } else if (LOG_LEVEL_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setLogLevel(Level.parse((String) logLevelComboBox.getSelectedItem()));
-        } else if (AIDA_AUTO_SAVE_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setAidaAutoSave(aidaAutoSaveCheckbox.isSelected());
-        } else if (EVENT_BUILDER_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setEventBuilderClassName((String) eventBuilderComboBox.getSelectedItem());
-        } else if (DETECTOR_NAME_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setDetectorName((String) detectorNameComboBox.getSelectedItem());
-        } else if (FREEZE_CONDITIONS_CHANGED.equals(e.getActionCommand())) {
-            if (configurationModel.hasPropertyKey(USER_RUN_NUMBER_PROPERTY) && configurationModel.getUserRunNumber() != null) {
-                configurationModel.setFreezeConditions(freezeConditionsCheckBox.isSelected());
-            } else {
-                throw new IllegalArgumentException("Conditions system may only be frozen if there is a valid user run number.");
-            }
-        } else if (DETECTOR_ALIAS_CHANGED.equals(e.getActionCommand())) {
-            configurationModel.setDetectorName(detectorAliasField.getText());
+    public void actionPerformed(ActionEvent event) {
+
+        //System.out.println("JobSettingsPanel.actionPerformed - " + event.getActionCommand());
+        //System.out.println("  source: " + event.getSource());
+
+        try {
+            configurationModel.removePropertyChangeListener(this);
+            if (event.getActionCommand().equals(Commands.CHOOSE_STEERING_FILE)) {
+                chooseSteeringFile();
+            } else if (event.getActionCommand().equals(Commands.CHOOSE_COMPACT_FILE)) {
+                chooseCompactFile();
+            } else if (DISCONNECT_ON_ERROR_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setDisconnectOnError(disconnectOnErrorCheckBox.isSelected());
+            } else if (DISCONNECT_ON_END_RUN_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setDisconnectOnEndRun(disconnectOnEndRunCheckBox.isSelected());
+            } else if (STEERING_TYPE_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setSteeringType(SteeringType.valueOf((String) steeringTypeComboBox.getSelectedItem()));
+            } else if (STEERING_RESOURCE_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setSteeringResource((String) steeringResourcesComboBox.getSelectedItem());
+            } else if (LOG_TO_FILE_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setLogToFile(logToFileCheckbox.isSelected());
+            } else if (LOG_LEVEL_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setLogLevel(Level.parse((String) logLevelComboBox.getSelectedItem()));
+            } else if (AIDA_AUTO_SAVE_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setAidaAutoSave(aidaAutoSaveCheckbox.isSelected());
+            } else if (EVENT_BUILDER_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setEventBuilderClassName((String) eventBuilderComboBox.getSelectedItem());
+            } else if (DETECTOR_NAME_CHANGED.equals(event.getActionCommand())) {
+                try {
+                    configurationModel.setDetectorName((String) detectorNameComboBox.getSelectedItem());
+                } catch (Exception exception) {
+                    exception.printStackTrace();
+                }
+            } else if (FREEZE_CONDITIONS_CHANGED.equals(event.getActionCommand())) {
+                if (configurationModel.hasPropertyKey(USER_RUN_NUMBER_PROPERTY) && configurationModel.getUserRunNumber() != null) {
+                    configurationModel.setFreezeConditions(freezeConditionsCheckBox.isSelected());
+                } else {
+                    throw new IllegalArgumentException("Conditions system may only be frozen if there is a valid user run number.");
+                }
+            } else if (DETECTOR_ALIAS_CHANGED.equals(event.getActionCommand())) {
+                configurationModel.setDetectorName(detectorAliasField.getText());
+            }
+        } finally {
+            configurationModel.addPropertyChangeListener(this);
         }
     }
 
@@ -338,199 +339,121 @@
      * GUI are distinguishable by their component object.
      */
     @Override
-    public void propertyChange(PropertyChangeEvent evt) {
-
-        // FIXME: Anyway to make sure this is not needed?
-        if (evt.getPropertyName().equals("ancestor"))
-            return;
-
-        Object source = evt.getSource();
-
-        if (source == steeringFileField) {
-            configurationModel.setSteeringFile(steeringFileField.getText());
-        } else if (source == logFileNameField) {
-            configurationModel.setLogFileName(logFileNameField.getText());
-        } else if (source == aidaSaveFileNameField) {
-            configurationModel.setAidaFileName(aidaSaveFileNameField.getText());
-        } else if (source == aidaAutoSaveCheckbox) {
-            configurationModel.setAidaAutoSave(aidaAutoSaveCheckbox.isSelected());
-        } else if (source == userRunNumberField) {
-            // Is run number being reset to null or empty?
-            if (userRunNumberField.getText() == null || userRunNumberField.getText().isEmpty()) {
-                System.out.println("resetting user run number back to null");
-                // Update the model to null user run number and do not freeze the conditions system.
-                configurationModel.setUserRunNumber(null);
-                configurationModel.setFreezeConditions(false);
-            } else {
-                try {
-                    System.out.println("setting new user run number " + evt.getNewValue());
-                    // Parse the run number.  Need to catch errors because it might be an invalid string.
-                    int userRunNumber = Integer.parseInt(userRunNumberField.getText());
-                    configurationModel.setUserRunNumber(userRunNumber);
-                    configurationModel.setFreezeConditions(true);
-                    System.out.println("successfully set run number to userRunNumber");
-                } catch (NumberFormatException e) {
-                    System.out.println("bad number format so ignoring user run number " + evt.getNewValue());
-                    userRunNumberField.setText((String) evt.getOldValue());
-                    throw new IllegalArgumentException("The value " + evt.getNewValue() + " is not a valid run number.");
-                }                            
-            }
-        } else if (source == maxEventsField) {
-            configurationModel.setMaxEvents(Long.parseLong(maxEventsField.getText()));
-            System.out.println("setMaxEvents - " + configurationModel.getMaxEvents());
-        }
-    }
-
-    /**
-     * Update the GUI from changes in the underlying configuration. The changes from the
-     * configuration are distinguishable by their property name.
+    public void propertyChange(PropertyChangeEvent evt) {                            
+        configurationModel.removePropertyChangeListener(this);
+        try {
+            Object source = evt.getSource();            
+            if (source == steeringFileField) {
+                configurationModel.setSteeringFile(steeringFileField.getText());
+            } else if (source == logFileNameField) {
+                configurationModel.setLogFileName(logFileNameField.getText());
+            } else if (source == aidaSaveFileNameField) {
+                configurationModel.setAidaFileName(aidaSaveFileNameField.getText());
+            } else if (source == aidaAutoSaveCheckbox) {
+                configurationModel.setAidaAutoSave(aidaAutoSaveCheckbox.isSelected());
+            } else if (source == userRunNumberField) {
+                // Is run number being reset to null or empty?
+                if (userRunNumberField.getText() == null || userRunNumberField.getText().isEmpty()) {
+                    // System.out.println("resetting user run number back to null");
+                    // Update the model to null user run number and do not freeze the conditions system.
+                    configurationModel.setUserRunNumber(null);
+                    configurationModel.setFreezeConditions(false);
+                } else {
+                    try {
+                        // System.out.println("setting new user run number " + evt.getNewValue());
+                        // Parse the run number. Need to catch errors because it might be an invalid string.
+                        int userRunNumber = Integer.parseInt(userRunNumberField.getText());
+                        configurationModel.setUserRunNumber(userRunNumber);
+                        configurationModel.setFreezeConditions(true);
+                        System.out.println("successfully set run number to userRunNumber");
+                    } catch (NumberFormatException e) {
+                        System.out.println("bad number format so ignoring user run number " + evt.getNewValue());
+                        userRunNumberField.setText((String) evt.getOldValue());
+                        // throw new IllegalArgumentException("The value " + evt.getNewValue() + " is not a valid run number.");
+                    }
+                }
+            } else if (source == maxEventsField) {
+                configurationModel.setMaxEvents(Long.parseLong(maxEventsField.getText()));
+                System.out.println("setMaxEvents - " + configurationModel.getMaxEvents());
+            }
+        } finally {
+            configurationModel.addPropertyChangeListener(this);
+        }
+    }
+
+    /**
+     * Update the GUI from changes in the underlying model. 
+     * The changes are distinguishable by their property name.
      */
     private class JobSettingsChangeListener implements PropertyChangeListener {
         @Override
         public void propertyChange(PropertyChangeEvent evt) {
-
-            // FIXME: Anyway to make sure this is not needed?
-            if (evt.getPropertyName().equals("ancestor"))
-                return;
-
-            Object value = evt.getNewValue();
-
-            if (evt.getPropertyName().equals(DETECTOR_NAME_PROPERTY)) {
-                detectorNameComboBox.setSelectedItem((String) value);
-            } else if (evt.getPropertyName().equals(DETECTOR_ALIAS_PROPERTY)) {
-                detectorAliasField.setText((String) value);
-            } else if (evt.getPropertyName().equals(AIDA_AUTO_SAVE_PROPERTY)) {
-                aidaAutoSaveCheckbox.setSelected((Boolean) value);
-            } else if (evt.getPropertyName().equals(AIDA_FILE_NAME_PROPERTY)) {
-                aidaSaveFileNameField.setText((String) value);
-            } else if (evt.getPropertyName().equals(DISCONNECT_ON_ERROR_PROPERTY)) {
-                disconnectOnErrorCheckBox.setSelected((Boolean) value);
-            } else if (evt.getPropertyName().equals(DISCONNECT_ON_END_RUN_PROPERTY)) {
-                disconnectOnEndRunCheckBox.setSelected((Boolean) value);
-            } else if (evt.getPropertyName().equals(EVENT_BUILDER_PROPERTY)) {
-                eventBuilderComboBox.setSelectedItem((String) value);
-            } else if (evt.getPropertyName().equals(LOG_FILE_NAME_PROPERTY)) {
-                logFileNameField.setText((String) value);
-            } else if (evt.getPropertyName().equals(LOG_LEVEL_PROPERTY)) {
-                logLevelComboBox.setSelectedItem(value.toString());
-            } else if (evt.getPropertyName().equals(LOG_TO_FILE_PROPERTY)) {
-                logToFileCheckbox.setSelected((Boolean) value);
-            } else if (evt.getPropertyName().equals(STEERING_TYPE_PROPERTY)) {
-                steeringTypeComboBox.setSelectedIndex(((SteeringType) value).ordinal());
-            } else if (evt.getPropertyName().equals(STEERING_FILE_PROPERTY)) {
-                if (value != null) {                    
-                    steeringFileField.setText((String) value);
-                } else {
-                    // A null value here is actually okay and means this field should be reset to have no value.
-                    steeringFileField.setText(null);
+            System.out.println("JobSettingsChangeListener.propertyChange");
+            System.out.println("  src: " + evt.getSource());
+            System.out.println("  propName: " + evt.getPropertyName());
+            System.out.println("  oldValue: " + evt.getOldValue());
+            System.out.println("  newValue: " + evt.getNewValue());
+            System.out.println("  propId: " + evt.getPropagationId());
+            if (evt.getSource() instanceof ConfigurationModel) {
+                Object value = evt.getNewValue();
+                configurationModel.removePropertyChangeListener(this);
+                try {
+                    if (evt.getPropertyName().equals(DETECTOR_NAME_PROPERTY)) {
+                        detectorNameComboBox.setSelectedItem((String) value);
+                    } else if (evt.getPropertyName().equals(DETECTOR_ALIAS_PROPERTY)) {
+                        detectorAliasField.setText((String) value);
+                    } else if (evt.getPropertyName().equals(AIDA_AUTO_SAVE_PROPERTY)) {
+                        aidaAutoSaveCheckbox.setSelected((Boolean) value);
+                    } else if (evt.getPropertyName().equals(AIDA_FILE_NAME_PROPERTY)) {
+                        aidaSaveFileNameField.setText((String) value);
+                    } else if (evt.getPropertyName().equals(DISCONNECT_ON_ERROR_PROPERTY)) {
+                        disconnectOnErrorCheckBox.setSelected((Boolean) value);
+                    } else if (evt.getPropertyName().equals(DISCONNECT_ON_END_RUN_PROPERTY)) {
+                        disconnectOnEndRunCheckBox.setSelected((Boolean) value);
+                    } else if (evt.getPropertyName().equals(EVENT_BUILDER_PROPERTY)) {
+                        eventBuilderComboBox.setSelectedItem((String) value);
+                    } else if (evt.getPropertyName().equals(LOG_FILE_NAME_PROPERTY)) {
+                        logFileNameField.setText((String) value);
+                    } else if (evt.getPropertyName().equals(LOG_LEVEL_PROPERTY)) {
+                        logLevelComboBox.setSelectedItem(value.toString());
+                    } else if (evt.getPropertyName().equals(LOG_TO_FILE_PROPERTY)) {
+                        logToFileCheckbox.setSelected((Boolean) value);
+                    } else if (evt.getPropertyName().equals(STEERING_TYPE_PROPERTY)) {
+                        steeringTypeComboBox.setSelectedIndex(((SteeringType) value).ordinal());
+                    } else if (evt.getPropertyName().equals(STEERING_FILE_PROPERTY)) {
+                        if (value != null) {
+                            steeringFileField.setText((String) value);
+                        } else {
+                            // A null value here is actually okay and means this field should be reset to have no value.
+                            steeringFileField.setText(null);
+                        }
+                    } else if (evt.getPropertyName().equals(STEERING_RESOURCE_PROPERTY)) {
+                        steeringResourcesComboBox.setSelectedItem(value);
+                    } else if (evt.getPropertyName().equals(USER_RUN_NUMBER_PROPERTY)) {
+                        if (value != null) {
+                            userRunNumberField.setText(Integer.toString((int) value));
+                        } else {
+                            userRunNumberField.setText(null);
+                        }
+                    } else if (evt.getPropertyName().equals(FREEZE_CONDITIONS_PROPERTY)) {
+                        if (value != null) {
+                            freezeConditionsCheckBox.setSelected((Boolean) value);
+                        }
+                    } else if (evt.getPropertyName().equals(MAX_EVENTS_PROPERTY)) {
+                        if (value != null) {
+                            maxEventsField.setText(value.toString());
+                        }
+                    }
+                } finally {
+                    configurationModel.addPropertyChangeListener(this);
                 }
-            } else if (evt.getPropertyName().equals(STEERING_RESOURCE_PROPERTY)) {
-                steeringResourcesComboBox.setSelectedItem(value);
-            } else if (evt.getPropertyName().equals(USER_RUN_NUMBER_PROPERTY)) {
-                if (value != null) {
-                    userRunNumberField.setText(Integer.toString((int)value));
-                } else {
-                    userRunNumberField.setText(null);
-                }
-            } else if (evt.getPropertyName().equals(FREEZE_CONDITIONS_PROPERTY)) {
-                if (value != null) {
-                    freezeConditionsCheckBox.setSelected((Boolean) value);
-                }
-            } else if (evt.getPropertyName().equals(MAX_EVENTS_PROPERTY)) {
-                if (value != null) {
-                    maxEventsField.setText(value.toString());
-                }
             }
         }
     }
     
-    /**
-     * Get the files with extension 'lcsim' from all loaded jar files.
-     * @param packageName The package name for filtering the resources.
-     * @return A list of embedded steering file resources.
-     */
-    private static String[] findSteeringResources(String packageName) {
-        List<String> resources = new ArrayList<String>();
-        URL url = JobSettingsPanel.class.getResource("MonitoringApplication.class");
-        String scheme = url.getProtocol();
-        if (!"jar".equals(scheme)) {
-            throw new IllegalArgumentException("Unsupported scheme.  Only jar is allowed.");
-        }
-        try {
-            JarURLConnection con = (JarURLConnection) url.openConnection();
-            JarFile archive = con.getJarFile();
-            Enumeration<JarEntry> entries = archive.entries();
-            while (entries.hasMoreElements()) {
-                JarEntry entry = entries.nextElement();
-                if (entry.getName().endsWith(".lcsim") && entry.getName().contains(packageName)) {
-                    resources.add(entry.getName());
-                }
-            }
-            archive.close();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-        java.util.Collections.sort(resources);
-        String[] arr = new String[resources.size()];
-        for (int i = 0; i < arr.length; i++) {
-            arr[i] = resources.get(i);
-        }
-        return arr;
-    }
-    
-    /**
-     * Find all classes that implement {@link org.hps.record.LCSimEventBuilder} and return
-     * a list of their canonical names.
-     * @return The list of classes implementing LCSimEventBuilder.
-     */
-    private static String[] findEventBuilderClassNames() {
-        Reflections reflections = new Reflections("org.hps");
-        Set<Class<? extends LCSimEventBuilder>> subTypes = reflections.getSubTypesOf(LCSimEventBuilder.class);
-        Set<String> classNames = new HashSet<String>();
-        for (Class<? extends LCSimEventBuilder> type : subTypes) {
-            classNames.add(type.getCanonicalName());
-        }
-        return classNames.toArray(new String[classNames.size()]);        
-    }
- 
-    /**
-     * Find a list of available detector names.
-     * Only those detectors that have names starting with "HPS" in their
-     * detector.properties files will be returned.
-     * @return The list of available detector names.
-     */
-    private static String[] findDetectorNames() {
-        ClassLoader classLoader = JobSettingsPanel.class.getClassLoader();
-        List<String> detectorNames = new ArrayList<String>();
-        URL url = JobSettingsPanel.class.getResource("MonitoringApplication.class");
-        String protocol = url.getProtocol();
-        if (!"jar".equals(protocol)) {
-            throw new RuntimeException("Unsupported URL protocol: " + url.getProtocol());
-        }
-        try {
-            JarURLConnection con = (JarURLConnection) url.openConnection();
-            JarFile archive = con.getJarFile();
-            Enumeration<JarEntry> entries = archive.entries();
-            while (entries.hasMoreElements()) {
-                JarEntry entry = entries.nextElement();
-                if (entry.getName().endsWith("detector.properties")) {
-                    InputStream inputStream = classLoader.getResourceAsStream(entry.getName());
-                    if (inputStream == null) {
-                        throw new RuntimeException("Failed to load jar entry: " + entry.getName());
-                    }
-                    Properties properties = new Properties();
-                    properties.load(inputStream);
-                    String detectorName = properties.getProperty("name");
-                    if (detectorName.startsWith("HPS")) {
-                        detectorNames.add(detectorName);
-                    }
-                }
-            }
-            archive.close();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-        Collections.sort(detectorNames);
-        return detectorNames.toArray(new String[detectorNames.size()]);
+    @Override
+    public void setConfigurationModel(ConfigurationModel model) {
+        super.setConfigurationModel(model);
+        model.addPropertyChangeListener(new JobSettingsChangeListener());
     }
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/LogTable.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/LogTable.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/LogTable.java	Tue Mar  3 19:46:30 2015
@@ -8,7 +8,7 @@
 import javax.swing.table.DefaultTableModel;
 
 /**
- * This is a simple Swing component to model the log table.
+ * This is a simple Swing component for the table of log messages.
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public class LogTable extends JTable {

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MenuBar.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MenuBar.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MenuBar.java	Tue Mar  3 19:46:30 2015
@@ -1,77 +1,74 @@
 package org.hps.monitoring.application;
+
+import static org.hps.monitoring.application.Commands.*;
 
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 
-import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 
-import static org.hps.monitoring.application.Commands.*;
-
 public class MenuBar extends JMenuBar {
 
-    private JMenuItem savePlotsItem;
-    private JMenuItem logItem;
-    private JMenuItem terminalItem;
-    private JMenuItem saveLayoutItem;
+    //private JMenuItem savePlotsItem;
+    //private JMenuItem logItem;
+    //private JMenuItem terminalItem;
+    //private JMenuItem saveLayoutItem;
     
     MenuBar(ActionListener listener) {
 
-        JMenu applicationMenu = new JMenu("Application");
-        applicationMenu.setMnemonic(KeyEvent.VK_A);
-        add(applicationMenu);
-
-        JMenuItem loadConfigItem = new JMenuItem("Load Settings ...");
-        //loadConfigItem.addActionListener(listener);
-        loadConfigItem.setMnemonic(KeyEvent.VK_C);
-        loadConfigItem.setActionCommand(SELECT_CONFIG_FILE);
-        loadConfigItem.setToolTipText("Load application settings from a properties file");
-        applicationMenu.add(loadConfigItem);
-
-        JMenuItem saveConfigItem = new JMenuItem("Save Settings ...");
-        //saveConfigItem.addActionListener(listener);
-        saveConfigItem.setMnemonic(KeyEvent.VK_S);
-        saveConfigItem.setActionCommand(SAVE_CONFIG_FILE);
-        saveConfigItem.setToolTipText("Save settings to a properties file");
-        applicationMenu.add(saveConfigItem);
-
-        JMenuItem settingsItem = new JMenuItem("Show Settings ...");
-        settingsItem.setMnemonic(KeyEvent.VK_P);
-        settingsItem.setActionCommand(SHOW_SETTINGS);
-        //settingsItem.addActionListener(listener);
-        settingsItem.setToolTipText("Show application settings menu");
-        applicationMenu.add(settingsItem);
-
-        applicationMenu.addSeparator();
-
-        saveLayoutItem = new JCheckBoxMenuItem("Save GUI Layout");
-        saveLayoutItem.setActionCommand(SAVE_LAYOUT);
-        //saveLayoutItem.addActionListener(listener);
-        saveLayoutItem.setToolTipText("Include current GUI layout when saving settings.");
-        //if (configurationModel.hasPropertyKey(ConfigurationModel.SAVE_LAYOUT_PROPERTY)) {
-        //    saveLayoutItem.setSelected(configurationModel.getSaveLayout());
-        //}
-        //saveLayoutItem.addPropertyChangeListener(this); 
+        JMenu fileMenu = new JMenu("File");
+        fileMenu.setMnemonic(KeyEvent.VK_F);
+        add(fileMenu);
         
-        applicationMenu.add(saveLayoutItem);
-
-        JMenuItem restoreLayoutItem = new JMenuItem("Restore Default GUI Layout");
-        restoreLayoutItem.setActionCommand(RESTORE_DEFAULT_GUI_LAYOUT);
-        //restoreLayoutItem.addActionListener(listener);
-        restoreLayoutItem.setToolTipText("Restore the GUI windows to their default positions and sizes");
-        applicationMenu.add(restoreLayoutItem);
-
-        applicationMenu.addSeparator();
-
+        JMenuItem openFileItem = new JMenuItem("Open File ...");
+        openFileItem.setMnemonic(KeyEvent.VK_P);
+        openFileItem.setActionCommand(OPEN_FILE);
+        openFileItem.addActionListener(listener);
+        openFileItem.setToolTipText("Open an EVIO or LCIO data file");
+        fileMenu.add(openFileItem);
+              
         JMenuItem exitItem = new JMenuItem("Exit");
         exitItem.setMnemonic(KeyEvent.VK_X);
         exitItem.setActionCommand(EXIT);
-        //exitItem.addActionListener(listener);
+        exitItem.addActionListener(listener);
         exitItem.setToolTipText("Exit from the application");
-        applicationMenu.add(exitItem);
+        fileMenu.add(exitItem);
+                
+        JMenu settingsMenu = new JMenu("Settings");
+        settingsMenu.setMnemonic(KeyEvent.VK_S);
+        add(settingsMenu);
+        
+        JMenuItem settingsItem = new JMenuItem("Show Settings ...");
+        settingsItem.setMnemonic(KeyEvent.VK_P);
+        settingsItem.setActionCommand(SETTINGS_SHOW);
+        settingsItem.addActionListener(listener);
+        settingsItem.setToolTipText("Show settings dialog");
+        settingsMenu.add(settingsItem);
+        
+        JMenuItem loadConfigItem = new JMenuItem("Load Settings ...");
+        loadConfigItem.addActionListener(listener);
+        loadConfigItem.setMnemonic(KeyEvent.VK_C);
+        loadConfigItem.setActionCommand(SETTINGS_LOAD);
+        loadConfigItem.setToolTipText("Load settings from a properties file");
+        settingsMenu.add(loadConfigItem);
 
+        JMenuItem saveConfigItem = new JMenuItem("Save Settings ...");
+        saveConfigItem.addActionListener(listener);
+        saveConfigItem.setMnemonic(KeyEvent.VK_S);
+        saveConfigItem.setActionCommand(SETTINGS_SAVE);
+        saveConfigItem.setToolTipText("Save configuration to a properties file");
+        settingsMenu.add(saveConfigItem);
+        
+        JMenuItem defaultSettingsItem = new JMenuItem("Load Default Settings");
+        defaultSettingsItem.addActionListener(listener);
+        defaultSettingsItem.setMnemonic(KeyEvent.VK_D);
+        defaultSettingsItem.setActionCommand(SETTINGS_LOAD_DEFAULT);
+        defaultSettingsItem.setToolTipText("Load the default settings");
+        settingsMenu.add(defaultSettingsItem);
+                      
+        /*               
         JMenu plotsMenu = new JMenu("Plots");
         plotsMenu.setMnemonic(KeyEvent.VK_O);
         add(plotsMenu);
@@ -143,6 +140,7 @@
         //screenshotItem.addActionListener(this);
         screenshotItem.setToolTipText("Save a screenshot to file");
         utilMenu.add(screenshotItem);
+        */
     }
     
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	Tue Mar  3 19:46:30 2015
@@ -1,56 +1,62 @@
 package org.hps.monitoring.application;
 
+import static org.hps.monitoring.application.Commands.*;
+import hep.aida.jfree.AnalysisFactory;
+import hep.aida.jfree.plotter.PlotterRegion;
+import hep.aida.jfree.plotter.PlotterRegionListener;
+
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.logging.Handler;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 
-import org.hps.conditions.database.DatabaseConditionsManager;
-import org.hps.job.JobManager;
-import org.hps.monitoring.application.RunPanel.RunModelUpdater;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+import javax.swing.filechooser.FileNameExtensionFilter;
+
 import org.hps.monitoring.application.model.Configuration;
 import org.hps.monitoring.application.model.ConfigurationModel;
+import org.hps.monitoring.application.model.ConnectionStatusModel;
 import org.hps.monitoring.application.model.RunModel;
+import org.hps.monitoring.application.util.DialogUtil;
 import org.hps.monitoring.application.util.ErrorHandler;
 import org.hps.monitoring.application.util.EtSystemUtil;
+import org.hps.monitoring.plotting.MonitoringAnalysisFactory;
+import org.hps.monitoring.plotting.MonitoringPlotFactory;
+import org.hps.monitoring.subsys.StatusCode;
+import org.hps.monitoring.subsys.SystemStatus;
+import org.hps.monitoring.subsys.SystemStatusListener;
 import org.hps.monitoring.subsys.SystemStatusRegistry;
-import org.hps.monitoring.subsys.et.EtSystemMonitor;
-import org.hps.monitoring.subsys.et.EtSystemStripCharts;
-import org.hps.record.LCSimEventBuilder;
-import org.hps.record.composite.CompositeLoop;
-import org.hps.record.composite.CompositeLoopConfiguration;
-import org.hps.record.composite.EventProcessingThread;
 import org.hps.record.enums.DataSourceType;
-import org.hps.record.evio.EvioDetectorConditionsProcessor;
-import org.lcsim.conditions.ConditionsManager;
-import org.lcsim.conditions.ConditionsReader;
-import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
-public class MonitoringApplication implements PropertyChangeListener {
+public class MonitoringApplication implements PropertyChangeListener, ActionListener, SystemStatusListener {
 
     static Logger logger;
+    static {
+        logger = Logger.getLogger(MonitoringApplication.class.getSimpleName());
+    }
     Handler logHandler;
     
     ErrorHandler errorHandler;
    
-    MonitoringActionListener actions;
     MonitoringApplicationFrame frame;    
-    SettingsDialog settingsDialog = new SettingsDialog();
     
     RunModel runModel = new RunModel();
     ConfigurationModel configurationModel = new ConfigurationModel();
+    ConnectionStatusModel connectionModel = new ConnectionStatusModel();
     
     SessionState sessionState;
+    EventProcessing processing;
     
     // The default configuration resource.
-    private static final String DEFAULT_CONFIG_RESOURCE = "/org/hps/monitoring/config/default_config.prop";
+    private static final String DEFAULT_CONFIGURATION = "/org/hps/monitoring/config/default_config.prop";
 
     // The application's global Configuration settings.
     private Configuration configuration;
@@ -75,6 +81,18 @@
         
         // Setup the error handler.
         this.errorHandler = new ErrorHandler(frame, logger);
+        
+        // Setup the main GUI component, passing it the data models and this object as the primary ActionListener.
+        frame = new MonitoringApplicationFrame(configurationModel, runModel, connectionModel, this);
+                        
+        // Add this class as a listener on the configuration model.
+        configurationModel.addPropertyChangeListener(this);
+        
+        // Setup the logger.
+        setupLogger();
+        
+        // Setup plotting backend and connect to the GUI.
+        setupAida();
         
         // Set the configuration.
         if (configuration != null) {
@@ -82,36 +100,33 @@
             this.configuration = configuration;
         } else {
             // Use the default configuration resource.
-            this.configuration = new Configuration(DEFAULT_CONFIG_RESOURCE);
-        }
-        
-        // Setup the action listener.
-        actions = new MonitoringActionListener(this);
-        
-        // Setup the main GUI component.
-        frame = new MonitoringApplicationFrame(actions);
-        frame.setRunModel(runModel);
-        
-        // Setup the logger.
-        setupLogger();
-        
-        // Setup the settings dialog box.
-        settingsDialog.addActionListener(actions);
-        settingsDialog.setConfigurationModel(configurationModel);
-        
-        // Add this class as a listener on the configuration model.
-        configurationModel.addPropertyChangeListener(this);      
-        
-        // Load the configuration.
+            this.configuration = new Configuration(DEFAULT_CONFIGURATION);
+        }
+                                      
+        // Load the current configuration.
         loadConfiguration();
     }
     
-    private void setupLogger() {
-        logger = Logger.getLogger(MonitoringApplication.class.getSimpleName());
+    void setupAida() {
+        MonitoringAnalysisFactory.register();
+        MonitoringPlotFactory.setRootPane(frame.plotPanel.getPlotPane());
+        MonitoringPlotFactory.setPlotterRegionListener(new PlotterRegionListener() {
+            @Override
+            public void regionSelected(PlotterRegion region) {
+                if (region == null)
+                    throw new RuntimeException("The region arg is null!!!");
+                // System.out.println("MonitoringApplication - regionSelected - " + region.title());
+                frame.plotInfoPanel.setCurrentRegion(region);
+            }
+        });
+        AnalysisFactory.configure();
+    }
+    
+    void setupLogger() {
         logHandler = new LogHandler();
         logger.setUseParentHandlers(false);
         logger.addHandler(logHandler);
-        logger.setLevel(Level.ALL);
+        logger.setLevel(Level.ALL);        
     }
         
     public static MonitoringApplication create(Configuration configuration) {
@@ -119,12 +134,12 @@
     }    
     
     public static MonitoringApplication create() {
-        return create(new Configuration(DEFAULT_CONFIG_RESOURCE));
+        return create(new Configuration(DEFAULT_CONFIGURATION));
     }
     
     @Override
     public void propertyChange(PropertyChangeEvent evt) {
-        // TODO Auto-generated method stub        
+        // TODO Auto-generated method stub
     }
     
     void loadConfiguration() {
@@ -133,10 +148,10 @@
         configurationModel.setConfiguration(configuration);
 
         // Log that a new configuration was loaded.
-        if (configuration.getFile() != null)
-            logger.config("Loaded configuration from file: " + configuration.getFile().getPath());
-        else
-            logger.config("Loaded configuration from resource: " + configuration.getResourcePath());
+        //if (configuration.getFile() != null)
+            //logger.config("Loaded configuration from file: " + configuration.getFile().getPath());
+        //else
+            //logger.config("Loaded configuration from resource: " + configuration.getResourcePath());
     }
     
     /**
@@ -146,15 +161,13 @@
      */
     void startSession() {
 
-        logger.fine("Starting a new monitoring session.");
+        //logger.fine("Starting a new monitoring session.");
 
         // Show a modal window that will block the GUI until connected or an error occurs.
         //JDialog dialog = DialogUtil.showStatusDialog(this, "Info", "Starting new session ...");
 
         try {
             
-            sessionState = new SessionState();
-
             // Reset the plot panel and global AIDA state.
             resetPlots();
 
@@ -163,35 +176,38 @@
             // e.g. an LCSim Driver, etc.
             SystemStatusRegistry.getSystemStatusRegistery().clear();
 
-            // Setup the LCSim JobControlManager and event builder.
-            setupLCSim();
-
+            // Setup event processing.
+            sessionState = new SessionState();
+            processing = new EventProcessing(sessionState, logger, errorHandler);
+            processing.setup(configurationModel);
+                        
+            // Add the dashboard updater.
+            sessionState.loop.getCompositeLoopAdapters().get(0).addProcessor(frame.runPanel.new RunModelUpdater());
+          
+            // Setup the system status monitor table.
+            setupSystemStatusMonitor();
+            
             // Connect to the ET system.
             connect();
-
-            // Setup the EventProcessingChain object using the EtConnection.
-            setupCompositeLoop();
+          
+            // Start event processing.
+            processing.start();
             
-            // Start the event processing thread.
-            startEventProcessingThread();
-
-            // Setup the system status monitor table.
-            //setupSystemStatusMonitor();
-
             // Start thread which will trigger a disconnect if the event processing finishes.
             //startSessionWatchdogThread();            
 
-            logger.info("successfully started the monitoring session");
+            //logger.info("successfully started the monitoring session");
 
         } catch (Exception e) {
 
-            logger.severe("error occurred while setting up the session");
+            //logger.severe("error occurred while setting up the session");
 
             // Log the error that occurred.
             errorHandler.setError(e).log().printStackTrace();
 
             // Disconnect from the session.
-            //disconnect(ConnectionStatus.ERROR);
+            // FIXME: This should never be needed as connected should only be set at end w/o errors.
+            disconnect();
 
         } finally {
             // Close modal window.
@@ -202,7 +218,7 @@
     /**
      * Connect to the ET system using the current connection settings.
      */
-    private void connect() throws IOException {
+    void connect() throws IOException {
 
         // Make sure applicable menu items are enabled or disabled.
         // This applies whether or not using an ET server or file source.
@@ -210,9 +226,6 @@
 
         // Setup the network connection if using an ET server.
         if (usingEtServer()) {
-
-            setConnectionStatus(ConnectionStatus.CONNECTION_REQUESTED);
-
             // Create a connection to the ET server.
             try {
                 createEtConnection();
@@ -221,10 +234,14 @@
             }
         } else {
             // This is when a direct file source is used and ET is not needed.
-            setConnectionStatus(ConnectionStatus.CONNECTED);
-        }
-    }
-    
+            connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED);
+        }
+    }
+    
+    /**
+     * 
+     * @return
+     */
     boolean usingEtServer() {
         return configurationModel.getDataSourceType().equals(DataSourceType.ET_SERVER);
     }    
@@ -233,7 +250,7 @@
      * Create a connection to an ET system using current parameters from the GUI. If successful, the
      * application's ConnectionStatus is changed to CONNECTED.
      */
-    private void createEtConnection() {
+    void createEtConnection() {
 
         // Setup connection to ET system.
         sessionState.connection = EtSystemUtil.createEtConnection(configurationModel);
@@ -241,29 +258,15 @@
         if (sessionState.connection != null) {
 
             // Set status to connected as there is now a live ET connection.
-            setConnectionStatus(ConnectionStatus.CONNECTED);
-
-            logger.info("successfully connected to ET system");
+            connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED);
+
+            //logger.info("successfully connected to ET system");
 
         } else {
-            // Some error occurred and the connection was not created.
-            setConnectionStatus(ConnectionStatus.ERROR);
-
             errorHandler.setError(new RuntimeException("Failed to create ET connection.")).log().printStackTrace().raiseException();
         }
     }    
-    
-    /**
-     * Set the connection status.
-     * @param status The connection status.
-     */
-    void setConnectionStatus(ConnectionStatus status) {
-        // FIXME
-        //frame.connectionStatusPanel.setConnectionStatus(status);
-        logger.info("connection status changed to: " + status.name());
-        logHandler.flush();
-    }
-    
+        
     void resetPlots() {
 
         // Clear the static AIDA tree in case plots are hanging around from previous sessions.
@@ -272,164 +275,261 @@
         // Reset plots.
         frame.plotPanel.reset();
     }           
-    
-    /**
-     * Setup the LCSim job manager and the event builder.
-     */
-    void setupLCSim() {
-
-        logger.info("setting up LCSim");
-
-        // Get steering resource or file as a String parameter.
-        String steering = null;
-        SteeringType steeringType = configurationModel.getSteeringType();
-        if (steeringType.equals(SteeringType.FILE))
-            try {
-                steering = configurationModel.getSteeringFile().getCanonicalPath();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
+                          
+    /**
+     * The action handler method for the application.
+     * @param e The event to handle.
+     */
+    public void actionPerformed(ActionEvent e) {
+
+        System.out.println("MonitoringApplication.actionPerformed - " + e.getActionCommand());
+
+        String cmd = e.getActionCommand();
+        if (CONNECT.equals(cmd)) {
+            // Run the start session method on a separate thread.
+            new Thread() {
+                public void run() {
+                    startSession();
+                }
+            }.start();
+        } else if (DISCONNECT.equals(cmd)) {
+            // Run the stop session method on a separate thread.
+            new Thread() {
+                public void run() {
+                    stopSession();
+                }
+            }.start();
+        } else if (SAVE_PLOTS.equals(cmd)) {
+            //savePlots();
+        } else if (CHOOSE_LOG_FILE.equals(cmd)) {
+            //chooseLogFile();
+        } else if (LOG_TO_TERMINAL.equals(cmd)) {
+            //logToTerminal();
+        } else if (SCREENSHOT.equals(cmd)) {
+            //chooseScreenshot();
+        } else if (EXIT.equals(cmd)) {
+            //exit();
+        } else if (SAVE_LOG_TABLE.equals(cmd)) {
+            //saveLogTableToFile();
+        } else if (CLEAR_LOG_TABLE.equals(cmd)) {
+            //clearLogTable();
+        } else if (PAUSE.equals(cmd)) {
+            //pauseEventProcessing();
+        } else if (NEXT.equals(cmd)) {
+            //nextEvent();
+        } else if (RESUME.equals(cmd)) {
+            //resumeEventProcessing();
+        } else if (LOG_LEVEL_CHANGED.equals(cmd)) {
+            //setLogLevel();
+        } else if (AIDA_AUTO_SAVE.equals(cmd)) {
+            //getJobSettingsPanel().chooseAidaAutoSaveFile();
+        } else if (SETTINGS_SHOW.equals(cmd)) {
+            showConfigurationDialog();
+        } else if (SETTINGS_LOAD.equals(cmd)) {
+            //chooseConfigurationFile();
+        } else if (SETTINGS_SAVE.equals(cmd)) {
+            //updateLayoutConfiguration(); /* Save current GUI layout settings first, if needed. */
+            //saveConfigurationFile();
+        } else if (SAVE_LAYOUT.equals(cmd)) {
+            //setSaveLayout();
+        } else if (RESTORE_DEFAULT_GUI_LAYOUT.equals(cmd)) {
+            //restoreDefaultLayout();
+        } else if (VALIDATE_DATA_FILE.equals(cmd)) {
+            //if (fileValidationThread == null) {
+            //    new FileValidationThread().start();
+            //}
+        } else if (RESET_PLOTS.equals(cmd)) {
+            //resetAidaTree();
+        } else if (SETTINGS_LOAD_DEFAULT.equals(cmd)) {
+            loadDefaultSettings();
+            DialogUtil.showInfoDialog(frame,
+                    "Default Configuration Loaded", 
+                    "The default configuration was loaded from resource " + '\n' + DEFAULT_CONFIGURATION);
+        } else if (OPEN_FILE.equals(cmd)) {
+            openFile();
+        }
+    }
+        
+    /**
+     * Disconnect from the current ET session with a particular status.
+     * @param status The connection status.
+     */
+    void disconnect() {
+
+        //logger.fine("Disconnecting the current session.");
+
+        // Cleanup the ET connection.
+        cleanupEtConnection();
+
+        // Update state of GUI to disconnected.
+        //setDisconnectedGuiState();
+
+        // Change application state to disconnected.
+        connectionModel.setConnectionStatus(ConnectionStatus.DISCONNECTED);
+
+        //logger.info("Disconnected from the session.");
+    }    
+    
+    /**
+     * Cleanup the ET connection.
+     */
+    void cleanupEtConnection() {
+        if (sessionState.connection != null) {
+            if (sessionState.connection.getEtSystem().alive()) {
+                //logger.fine("cleaning up ET connection");
+                sessionState.connection.cleanup();
+                //logger.fine("done cleaning up tET connection");
             }
-        else
-            steering = configurationModel.getSteeringResource();
-
-        logger.config("Set steering to " + steering + " with type " + (steeringType == SteeringType.RESOURCE ? "RESOURCE" : "FILE"));
+            sessionState.connection = null;
+        }
+    }
+    
+    /**
+     * Configure the system status monitor panel for a new job.
+     */
+    void setupSystemStatusMonitor() {
+        // Clear the system status monitor table.
+        frame.systemStatusTable.getTableModel().clear();
+
+        // Get the global registry of SystemStatus objects.
+        SystemStatusRegistry registry = SystemStatusRegistry.getSystemStatusRegistery();
+
+        // Process the SystemStatus objects.
+        for (SystemStatus systemStatus : registry.getSystemStatuses()) {
+            // Add a row to the table for every SystemStatus.
+            frame.systemStatusTable.getTableModel().addSystemStatus(systemStatus);
+
+            // Add this class as a listener so all status changes can be logged.
+            systemStatus.addListener(this);
+        }
+    }
+    
+    /**
+     * Hook for logging all status changes from the system status monitor.
+     */
+    @Override
+    public void statusChanged(SystemStatus status) {
+
+        // Choose the appropriate log level.
+        Level level = Level.INFO;
+        if (status.getStatusCode().equals(Level.WARNING)) {
+            level = Level.WARNING;
+        } else if (status.getStatusCode().ordinal() >= StatusCode.ERROR.ordinal()) {
+            level = Level.SEVERE;
+        }
+
+        // Log all status changes.
+        //logger.log(level, "STATUS, " + "subsys: " + status.getSubsystem() + ", " 
+        //        + "code: " + status.getStatusCode().name() 
+        //        + ", " + "descr: " + status.getDescription() 
+        //       + ", " + "mesg: " + status.getMessage());
+    }
+    
+    /**
+     * Stop the session by killing the event processing thread, ending the job, and disconnecting
+     * from the ET system.
+     */
+    void stopSession() {
+        // Show a modal message window while this method executes.
+        //JDialog dialog = DialogUtil.showStatusDialog(this, "Info", "Disconnecting from session ...");
 
         try {
-            // Create and the job manager.  The conditions manager is instantiated from this call but not configured.
-            sessionState.jobManager = new JobManager();
+            // Log message.
+            //logger.log(Level.FINER, "stopping the session");
+
+            // Kill the watchdog thread which looks for disconnects, if it is active.
+            //killSessionWatchdogThread();
+
+            // Automatically write AIDA file from job settings.
+            //saveAidaFile();
+
+            // Disconnect from ET system, if using the ET server, and set the proper disconnected
+            // GUI state.
+            disconnect();
+
+            // Stop the event processing, which is called after the ET system goes down to avoid
+            // hanging in calls to ET system.
+            processing.stop();
+
+            //logger.log(Level.INFO, "session was stopped");
+
+        } finally {
+            // Close modal message window.
+            //dialog.dispatchEvent(new WindowEvent(dialog, WindowEvent.WINDOW_CLOSING));
+        }
+    }       
+    
+    void loadDefaultSettings() {
+        configuration = new Configuration(DEFAULT_CONFIGURATION);
+        configurationModel.setConfiguration(configuration);
+    }
+    
+    void showConfigurationDialog() {
+        frame.settingsDialog.setVisible(true);
+    }
+    
+    /**
+     * This is a simple file filter that will accept files with ".evio" anywhere in their name. 
+     */
+    static class EvioFileFilter extends FileFilter {
+
+        public EvioFileFilter() {            
+        }
+        
+        @Override
+        public boolean accept(File pathname) {
+            if (pathname.getName().contains(".evio") || pathname.isDirectory()) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+        
+        @Override
+        public String getDescription() {
+            return "EVIO files";
+        }        
+    }
+    
+    /**
+     * Open a file data source using a <code>JFileChooser</code>.
+     */
+    static FileFilter lcioFilter = new FileNameExtensionFilter("LCIO files", "slcio");
+    static EvioFileFilter evioFilter = new EvioFileFilter();
+    void openFile() {
+        JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
+        fc.setAcceptAllFileFilterUsed(false);
+        fc.addChoosableFileFilter(lcioFilter);
+        fc.addChoosableFileFilter(evioFilter);
+        fc.setDialogTitle("Select Data File");
+        int r = fc.showDialog(frame, "Select ...");        
+        if (r == JFileChooser.APPROVE_OPTION) {
+                                  
+            // Set data source path.            
+            final String filePath = fc.getSelectedFile().getPath();
+            configurationModel.setDataSourcePath(filePath);
             
-            if (configurationModel.hasValidProperty(ConfigurationModel.DETECTOR_ALIAS_PROPERTY)) {
-                // Set a detector alias.                
-                ConditionsReader.addAlias(configurationModel.getDetectorName(), "file://" + configurationModel.getDetectorAlias());
-                logger.config("using detector alias " + configurationModel.getDetectorAlias());
+            // Set data source type.
+            FileFilter filter = fc.getFileFilter();
+            if (filter == lcioFilter) {
+                configurationModel.setDataSourceType(DataSourceType.LCIO_FILE);
+            } else if (filter == evioFilter) {
+                configurationModel.setDataSourceType(DataSourceType.EVIO_FILE);
             }
-                        
-            // Setup the event builder to translate from EVIO to LCIO.
-            // This must happen before Driver setup so the builder's listeners are activated first!
-            createEventBuilder();
-            
-            // Configure the job manager for the XML steering.
-            sessionState.jobManager.setPerformDryRun(true);
-            if (steeringType == SteeringType.RESOURCE) {
-                setupSteeringResource(steering);
-            } else if (steeringType.equals(SteeringType.FILE)) {
-                setupSteeringFile(steering);
-            }
-           
-            // Is there a user specified run number from the JobPanel?
-            if (configurationModel.hasValidProperty(ConfigurationModel.USER_RUN_NUMBER_PROPERTY)) {
-                int userRunNumber = configurationModel.getUserRunNumber();
-                String detectorName = configurationModel.getDetectorName();
-                DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
-                logger.config("setting user run number " + userRunNumber + " with detector " + detectorName);
-                conditionsManager.setDetector(configurationModel.getDetectorName(), userRunNumber);
-                if (configurationModel.hasPropertyKey(ConfigurationModel.FREEZE_CONDITIONS_PROPERTY)) {
-                    // Freeze the conditions system to ignore run numbers from the events.  
-                    logger.config("user configured to freeze conditions system from monitoring app");
-                    conditionsManager.freeze();
-                } else {
-                    // Allow run numbers to be picked up from the events.
-                    logger.config("user run number specified but conditions system is NOT frozen");
-                    conditionsManager.unfreeze();
-                }
-            }
-
-            logger.info("LCSim setup was successful.");
-
-        } catch (Throwable t) {
-            // Catch all errors and rethrow them as RuntimeExceptions.
-            errorHandler.setError(t).setMessage("Error setting up LCSim.").printStackTrace().raiseException();
-        }
-    }
-
-    void setupSteeringFile(String steering) {
-        logger.config("setting up steering file: " + steering);
-        sessionState.jobManager.setup(new File(steering));
-    }
-
-    void setupSteeringResource(String steering) throws IOException {
-        logger.config("setting up steering resource: " + steering);
-        InputStream is = this.getClass().getClassLoader().getResourceAsStream(steering);
-        if (is == null)
-            throw new IOException("Steering resource is not accessible or does not exist.");
-        sessionState.jobManager.setup(is);
-        is.close();
-    }
-        
-    /**
-     * Create the event builder for converting EVIO events to LCSim.
-     */
-    void createEventBuilder() {
-
-        // Get the class for the event builder.
-        String eventBuilderClassName = configurationModel.getEventBuilderClassName();
-
-        logger.config("initializing event builder: " + eventBuilderClassName);
-
-        try {
-            // Create a new instance of the builder class.
-            sessionState.eventBuilder = (LCSimEventBuilder) Class.forName(eventBuilderClassName).newInstance();
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to create LCSimEventBuilder.", e);
-        }
-
-        // Add the builder as a listener so it is notified when conditions change.
-        ConditionsManager.defaultInstance().addConditionsListener(sessionState.eventBuilder);
-
-        logger.config("successfully initialized event builder: " + eventBuilderClassName);
-    }
-    
-    void setupCompositeLoop() {
-
-        CompositeLoopConfiguration loopConfig = new CompositeLoopConfiguration()
-            .setStopOnEndRun(configurationModel.getDisconnectOnEndRun())
-            .setStopOnErrors(configurationModel.getDisconnectOnError())
-            .setDataSourceType(configurationModel.getDataSourceType())
-            .setProcessingStage(configurationModel.getProcessingStage())
-            .setEtConnection(sessionState.connection)
-            .setFilePath(configurationModel.getDataSourcePath())
-            .setLCSimEventBuilder(sessionState.eventBuilder)
-            .setDetectorName(configurationModel.getDetectorName());
-
-        if (configurationModel.hasValidProperty(ConfigurationModel.MAX_EVENTS_PROPERTY)) {
-            long maxEvents = configurationModel.getMaxEvents();
-            if (maxEvents > 0L) {
-                logger.config("processing will stop after max events: " + maxEvents);
-                loopConfig.setMaxRecords(maxEvents);
-            }
-        }
-        
-        // Add all Drivers from the JobManager.
-        for (Driver driver : sessionState.jobManager.getDriverExecList()) {
-            loopConfig.add(driver);
-        }
-
-        // Using ET server?
-        if (usingEtServer()) {
-
-            // ET system monitor.
-            loopConfig.add(new EtSystemMonitor());
-
-            // ET system strip charts.
-            loopConfig.add(new EtSystemStripCharts());
-        }
-
-        // RunPanel updater.
-        loopConfig.add(frame.runPanel.new RunModelUpdater());
-                
-        // Setup for conditions activation via EVIO events.
-        loopConfig.add(new EvioDetectorConditionsProcessor(configurationModel.getDetectorName()));
-
-        // Create the CompositeLoop with the configuration.
-        sessionState.loop = new CompositeLoop(loopConfig);        
+        }
     }    
     
-    void startEventProcessingThread() {
-        
-        // Create the processing thread.
-        sessionState.processingThread = new EventProcessingThread(sessionState.loop);
-
-        // Start the processing thread.
-        sessionState.processingThread.start();
-    }
+    void saveSettings() {
+        JFileChooser fc = new JFileChooser();
+        fc.setDialogTitle("Save Configuration");
+        fc.setCurrentDirectory(new File("."));
+        int r = fc.showSaveDialog(frame);
+        if (r == JFileChooser.APPROVE_OPTION) {
+            File f = fc.getSelectedFile();
+            //log(Level.CONFIG, "Saving configuration to file <" + f.getPath() + ">");
+            configuration.writeToFile(f);
+        }
+    }
+    
+    
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	Tue Mar  3 19:46:30 2015
@@ -2,16 +2,25 @@
 
 import java.awt.BorderLayout;
 import java.awt.Dimension;
+import java.awt.FlowLayout;
 import java.awt.GraphicsConfiguration;
 import java.awt.Rectangle;
 import java.awt.event.ActionListener;
 
+import javax.swing.BoxLayout;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
 import javax.swing.JSplitPane;
 import javax.swing.JTabbedPane;
+import javax.swing.SwingConstants;
 
+import org.hps.monitoring.application.DataSourceComboBox.DataSourceItem;
+import org.hps.monitoring.application.model.ConfigurationModel;
+import org.hps.monitoring.application.model.ConnectionStatusModel;
 import org.hps.monitoring.application.model.RunModel;
 
 /**
@@ -24,33 +33,77 @@
     PlotPanel plotPanel;
     PlotInfoPanel plotInfoPanel;
     LogTable logTable;
+    SystemStatusTable systemStatusTable;
+    JPanel buttonsPanel;
     
-    GraphicsConfiguration graphics = this.getGraphicsConfiguration();
-    Rectangle bounds = graphics.getBounds();
+    SettingsDialog settingsDialog;
+    
+    // Proportional layout parameters relative to the screen size.
+    static final double FULL_SIZE = 1.0;
+    static final double TOP_PANEL_HEIGHT = 0.05;
+    static final double BOTTOM_PANEL_HEIGHT = FULL_SIZE - TOP_PANEL_HEIGHT;
+    static final double LEFT_PANEL_WIDTH = 0.3;
+    static final double RIGHT_PANEL_WIDTH = FULL_SIZE - LEFT_PANEL_WIDTH;
+    static final double PLOT_PANEL_HEIGHT = 0.8;
     
     /**
      * 
      * @param listener
      */
-    public MonitoringApplicationFrame(ActionListener listener) {
+    public MonitoringApplicationFrame(
+            ConfigurationModel configurationModel, 
+            RunModel runModel, 
+            ConnectionStatusModel connectionModel, 
+            ActionListener listener) {
                 
         // Create the content panel.
         JPanel contentPanel = new JPanel();
-        contentPanel.setLayout(new BorderLayout());
-        contentPanel.setPreferredSize(scaleBounds(1.0, 1.0));
         setContentPane(contentPanel);
+        contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
+        contentPanel.setOpaque(true);
+        setProportionalSize(contentPanel, FULL_SIZE, FULL_SIZE);
         
         // Create the top panel.
         JPanel topPanel = new JPanel();
-        topPanel.setPreferredSize(scaleBounds(1.0, 0.1));
+        topPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 0));
+        setProportionalSize(topPanel, FULL_SIZE, TOP_PANEL_HEIGHT);
+        contentPanel.add(topPanel);
+        
+        // Create the connection status panel.
+        JPanel connectionPanel = new ConnectionStatusPanel(connectionModel);
+        topPanel.add(connectionPanel);
+        
+        // Add vertical separator.
+        JSeparator sep = new JSeparator(SwingConstants.VERTICAL);
+        sep.setPreferredSize(new Dimension(5, topPanel.getPreferredSize().height));
+        topPanel.add(sep);
+        
+        // Create the buttons panel.
+        buttonsPanel = new EventButtonsPanel(connectionModel, listener);
+        topPanel.add(buttonsPanel);
+        
+        // Add vertical separator.
+        sep = new JSeparator(SwingConstants.VERTICAL);
+        sep.setPreferredSize(new Dimension(5, topPanel.getPreferredSize().height));
+        topPanel.add(sep);
+        
+        // Add the data source combo box.
+        JComboBox<DataSourceItem> dataSourceComboBox = new DataSourceComboBox(listener);
+        topPanel.add(dataSourceComboBox);
+        
+        // Create the bottom panel.
+        JPanel bottomPanel = new JPanel();
+        bottomPanel.setLayout(new BorderLayout());
+        setProportionalSize(bottomPanel, FULL_SIZE, BOTTOM_PANEL_HEIGHT);
+        contentPanel.add(bottomPanel);
                                 
         // Create the left panel.
         JPanel leftPanel = new JPanel();
         leftPanel.setLayout(new BorderLayout());
-        leftPanel.setPreferredSize(scaleBounds(0.3, 1.0));
+        setProportionalSize(leftPanel, LEFT_PANEL_WIDTH, FULL_SIZE);
                         
         // Create the run dashboard.
-        runPanel = new RunPanel();
+        runPanel = new RunPanel(runModel);
 
         // Create the tabbed pane for content in bottom of left panel such as log table and system monitor.
         JTabbedPane tableTabbedPane = new JTabbedPane();
@@ -60,7 +113,7 @@
         tableTabbedPane.addTab("Log", new JScrollPane(logTable));
         
         // Create the system monitor.
-        SystemStatusTable systemStatusTable = new SystemStatusTable();
+        systemStatusTable = new SystemStatusTable();
         tableTabbedPane.addTab("System Status Monitor", new JScrollPane(systemStatusTable));
         
         // Vertical split pane in left panel.
@@ -76,48 +129,48 @@
                 
         // Create the plot panel.
         plotPanel = new PlotPanel();
-        plotPanel.setPreferredSize(scaleBounds(0.7, 0.8));
+        setProportionalSize(plotPanel, RIGHT_PANEL_WIDTH, PLOT_PANEL_HEIGHT);
         
         // Create the right panel vertical split pane for displaying plots and their information and statistics.
         JSplitPane rightSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, plotPanel, plotInfoPanel);
-        rightSplitPane.setPreferredSize(scaleBounds(0.7, 1.0));
+        setProportionalSize(rightSplitPane, RIGHT_PANEL_WIDTH, FULL_SIZE);
         rightSplitPane.setResizeWeight(0.9);
         rightPanel.add(rightSplitPane, BorderLayout.CENTER);
                        
         // Create the main horizontal split pane for dividing the left and right panels.
         JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel);
-        contentPanel.add(mainSplitPane, BorderLayout.CENTER);
+        bottomPanel.add(mainSplitPane, BorderLayout.CENTER);
         
         // Create the menu bar.
-        setJMenuBar(new MenuBar(listener));
-        
-        // Setup the frame now that all components have been added.
+        setJMenuBar(new MenuBar(listener));                
+                        
+        // Setup the frame now that all components have been added.        
         pack();
         setExtendedState(JFrame.MAXIMIZED_BOTH);
         setVisible(true);
+        
+        // Setup the settings dialog box.
+        settingsDialog = new SettingsDialog(configurationModel, listener);
     }
     
     /**
-     * Scale the screen bounds of the <code>JFrame</code> by the given proportions.
+     * Set the size of a Swing component using proportions of the current screen bounds.
+     * @param component The component to resize.
      * @param scaleX The X scaling (must be between 0 and 1).
      * @param scaleY The Y scaling (must be between 0 and 1).
+     * @param setSize Call the setSize method as well as setPreferredSize (which is the default).
      * @return
      */
-    Dimension scaleBounds(double scaleX, double scaleY) {                
+    void setProportionalSize(JComponent component, double scaleX, double scaleY) {                    
+        GraphicsConfiguration graphics = this.getGraphicsConfiguration();        
+        Rectangle bounds = graphics.getBounds();        
         if (scaleX < 0 || scaleX > 1) {
             throw new IllegalArgumentException("scaleX must be > 0 and <= 1.");
         }
         if (scaleY < 0 || scaleY > 1) {
-            throw new IllegalArgumentException("scaleX must be > 0 and <= 1.");
+            throw new IllegalArgumentException("scaleY must be > 0 and <= 1.");
         }
-        return new Dimension((int)(bounds.getX() * scaleX), (int)(bounds.getY() * scaleX));
-    }        
-    
-    /**
-     * 
-     * @param runModel
-     */
-    void setRunModel(RunModel runModel) {
-        runPanel.setModel(runModel);
-    }    
+        Dimension scaledDimension = new Dimension((int)(bounds.getWidth() * scaleX), (int)(bounds.getHeight() * scaleY));
+        component.setPreferredSize(scaledDimension);
+    }           
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/RunPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/RunPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/RunPanel.java	Tue Mar  3 19:46:30 2015
@@ -261,33 +261,33 @@
     public void propertyChange(PropertyChangeEvent evt) {
         Object value = evt.getNewValue();
         if (RUN_NUMBER_PROPERTY.equals(evt.getPropertyName())) {
-            this.runNumberField.setValue((Integer) value);
+            runNumberField.setValue((Integer) value);
         } else if (START_DATE_PROPERTY.equals(evt.getPropertyName())) {
             if (value != null)
-                this.startDateField.setValue((Date) value);
+                startDateField.setValue((Date) value);
             else
-                this.startDateField.setValue("");
+                startDateField.setValue("");
         } else if (END_DATE_PROPERTY.equals(evt.getPropertyName())) {
             if (value != null)
-                this.endDateField.setValue((Date) value);
+                endDateField.setValue((Date) value);
             else
-                this.endDateField.setValue("");
+                endDateField.setValue("");
         } else if (RUN_LENGTH_PROPERTY.equals(evt.getPropertyName())) {
-            this.lengthField.setValue((Integer) value);
+            lengthField.setValue((Integer) value);
         } else if (TOTAL_EVENTS_PROPERTY.equals(evt.getPropertyName())) {
-            this.totalEventsField.setValue((Integer) value);
+            totalEventsField.setValue((Integer) value);
         } else if (EVENTS_RECEIVED_PROPERTY.equals(evt.getPropertyName())) {
-            this.eventsReceivedField.setValue((Integer) value);
+            eventsReceivedField.setValue((Integer) value);
         } else if (ELAPSED_TIME_PROPERTY.equals(evt.getPropertyName())) {
-            this.elapsedTimeField.setValue((Integer) value);
+            elapsedTimeField.setValue((Integer) value);
         } else if (DATA_RECEIVED_PROPERTY.equals(evt.getPropertyName())) {
-            this.dataReceivedField.setValue(formatter.format((Double) value));
+            dataReceivedField.setValue(formatter.format((Double) value));
         } else if (EVENT_NUMBER_PROPERTY.equals(evt.getPropertyName())) {
-            this.eventNumberField.setValue((Integer) value);
+            eventNumberField.setValue((Integer) value);
         } else if (DATA_RATE_PROPERTY.equals(evt.getPropertyName())) {
-            this.dataRateField.setValue(formatter.format((Double) value));
+            dataRateField.setValue(formatter.format((Double) value));
         } else if (EVENT_RATE_PROPERTY.equals(evt.getPropertyName())) {
-            this.eventRateField.setValue(formatter.format((Double) value));
+            eventRateField.setValue(formatter.format((Double) value));
         }
     }
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsDialog.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsDialog.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsDialog.java	Tue Mar  3 19:46:30 2015
@@ -14,10 +14,14 @@
  */
 public class SettingsDialog extends JDialog {
 
-    final SettingsPanel settingsPanel = new SettingsPanel(this);
+    final SettingsPanel settingsPanel;
 
-    public SettingsDialog() {
+    public SettingsDialog(ConfigurationModel configurationModel, ActionListener listener) {
 
+        // Initialize the GUI panel.
+        settingsPanel = new SettingsPanel(this, configurationModel, listener);
+        
+        // Configure the frame.
         setTitle("Settings");
         setContentPane(settingsPanel);
         setResizable(false);
@@ -25,26 +29,11 @@
         setModalityType(ModalityType.APPLICATION_MODAL);
         pack();
 
+        // Add window listener for turning invisible when closing.
         addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                 setVisible(false);
             }
-        });
+        });        
     }
-
-    public SettingsPanel getSettingsPanel() {
-        return settingsPanel;
-    }
-    
-    void addActionListener(ActionListener listener) {
-        settingsPanel.addActionListener(listener);
-        settingsPanel.getJobSettingsPanel().addActionListener(listener);
-        settingsPanel.getDataSourcePanel().addActionListener(listener);
-    }
-    
-    void setConfigurationModel(ConfigurationModel model) {
-        settingsPanel.getJobSettingsPanel().setConfigurationModel(model);
-        settingsPanel.getConnectionPanel().setConfigurationModel(model);
-        settingsPanel.getDataSourcePanel().setConfigurationModel(model);
-    }    
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/SettingsPanel.java	Tue Mar  3 19:46:30 2015
@@ -12,25 +12,41 @@
 import javax.swing.JPanel;
 import javax.swing.JTabbedPane;
 
+import org.hps.monitoring.application.model.ConfigurationModel;
+
 /**
  * The container component with the tabs that have job and connection settings.
  */
 public class SettingsPanel extends JPanel implements ActionListener {
 
     JTabbedPane tabs;
-    JobSettingsPanel jobPanel = new JobSettingsPanel();
-    ConnectionSettingsPanel connectionPanel = new ConnectionSettingsPanel();
-    DataSourcePanel dataSourcePanel = new DataSourcePanel();
+    JobSettingsPanel jobPanel;
+    ConnectionSettingsPanel connectionPanel;
+    DataSourcePanel dataSourcePanel;
     static final String OKAY_COMMAND = "settingsOkay";
 
-    JButton defaultsButton;
+    //JButton defaultsButton;
 
     JDialog parent;
 
-    SettingsPanel(JDialog parent) {
+    SettingsPanel(JDialog parent, ConfigurationModel configurationModel, ActionListener listener) {
 
         this.parent = parent;
-
+        
+        connectionPanel = new ConnectionSettingsPanel();        
+        jobPanel = new JobSettingsPanel();
+        dataSourcePanel = new DataSourcePanel();
+        
+        // Push configuration to sub-components.
+        connectionPanel.setConfigurationModel(configurationModel);
+        jobPanel.setConfigurationModel(configurationModel);
+        dataSourcePanel.setConfigurationModel(configurationModel);
+        
+        // Add ActionListener to sub-components.
+        connectionPanel.addActionListener(listener);
+        jobPanel.addActionListener(listener);
+        dataSourcePanel.addActionListener(listener);
+               
         this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
 
         tabs = new JTabbedPane();
@@ -43,14 +59,14 @@
         okayButton.setActionCommand(OKAY_COMMAND);
         okayButton.addActionListener(this);
 
-        defaultsButton = new JButton("Defaults");
-        defaultsButton.setActionCommand(Commands.LOAD_DEFAULT_CONFIG_FILE);
-        defaultsButton.addActionListener(this);
+        //defaultsButton = new JButton("Defaults");
+        //defaultsButton.setActionCommand(Commands.LOAD_DEFAULT_SETTINGS);
+        //defaultsButton.addActionListener(this);
 
         add(Box.createRigidArea(new Dimension(1, 5)));
         JPanel buttonsPanel = new JPanel();
         buttonsPanel.add(okayButton);
-        buttonsPanel.add(defaultsButton);
+        //buttonsPanel.add(defaultsButton);
         buttonsPanel.setLayout(new FlowLayout());
         add(buttonsPanel);
         add(Box.createRigidArea(new Dimension(1, 5)));
@@ -80,7 +96,7 @@
      * the default configuration when the "Defaults" button is pushed from the settings panel.
      * @param listener
      */
-    void addActionListener(ActionListener listener) {
-        defaultsButton.addActionListener(listener);
-    }
+    //void addActionListener(ActionListener listener) {
+    //    defaultsButton.addActionListener(listener);
+    //}
 }

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/AbstractModel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/AbstractModel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/AbstractModel.java	Tue Mar  3 19:46:30 2015
@@ -35,26 +35,27 @@
     public void removePropertyChangeListener(PropertyChangeListener listener) {
         propertyChangeSupport.removePropertyChangeListener(listener);
     }
-
+       
     protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
-        if (listenersEnabled)
+        System.out.println("AbstractModel.firePropertyChange");
+        System.out.println("  propName: " + propertyName);
+        System.out.println("  oldValue: " + oldValue);
+        System.out.println("  newValue: " + newValue);
+        if (listenersEnabled) {
             propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
-        // System.out.println("firePropertyChange");
-        // System.out.println("  name: " + propertyName);
-        // System.out.println("  old value: " + oldValue);
-        // System.out.println("  new value: " + newValue);
+        }
     }
 
     protected void firePropertyChange(PropertyChangeEvent evt) {
-        if (listenersEnabled)
+        if (listenersEnabled) {
             propertyChangeSupport.firePropertyChange(evt);
+        }
     }
 
     abstract public String[] getPropertyNames();
 
-    // FIXME: This method is kind of a hack. Any other good way to do this?
-    public void fireAllChanged() {
-        // System.out.println("AbstractModel.fireAllChanged");
+    public void fireModelChanged() {
+        //System.out.println("AbstractModel.fireModelChanged");
         if (!listenersEnabled)
             return;
         propertyLoop: for (String property : getPropertyNames()) {
@@ -76,7 +77,7 @@
                     throw new RuntimeException("Property " + property + " is missing a get method.", e);
                 } catch (InvocationTargetException e) {
                     // Is the cause of the problem an illegal argument to the method?
-                    System.out.println("cause: " + e.getCause().getMessage());
+                    //System.out.println("cause: " + e.getCause().getMessage());
                     if (e.getCause() instanceof IllegalArgumentException) {
                         // For this error, assume that the key itself is missing from the configuration which is a warning.
                         System.err.println("The key " + property + " is not set in the configuration.");
@@ -100,7 +101,8 @@
     }
 
     /**
-     * This method will statically extract property names from a class, which in this package's conventions are statically declared, public strings that end with "_PROPERTY".
+     * This method will statically extract property names from a class, which in this package's conventions are statically declared, 
+     * public strings that end with "_PROPERTY".
      * 
      * @param type The class with the properties.
      * @return The list of property names.

Modified: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java	Tue Mar  3 19:46:30 2015
@@ -1,10 +1,7 @@
 package org.hps.monitoring.application.model;
 
 import java.io.File;
-import java.lang.reflect.Field;
 import java.util.logging.Level;
-
-import javassist.Modifier;
 
 import org.hps.monitoring.application.SteeringType;
 import org.hps.record.enums.DataSourceType;
@@ -15,12 +12,9 @@
  * A model of the global configuration parameters that can be used to automatically update the GUI
  * from a configuration or push changes from GUI components into the current configuration.
  */
-// FIXME: When the set methods are called, e.g. from GUI updates, this triggers
-//        a property change event that pushes the values back to the GUI again.
-// FIXME: Should check if property exists in set methods before retrieving old value for all set methods.
 public final class ConfigurationModel extends AbstractModel {
 
-    Configuration config;
+    Configuration configuration;
 
     // Job setting properties.
     public static final String AIDA_AUTO_SAVE_PROPERTY = "AidaAutoSave";
@@ -35,10 +29,6 @@
     public static final String LOG_LEVEL_PROPERTY = "LogLevel";
     public static final String LOG_TO_FILE_PROPERTY = "LogToFile";
     public static final String MAX_EVENTS_PROPERTY = "MaxEvents";
-    public static final String MONITORING_APPLICATION_LAYOUT_PROPERTY = "MonitoringApplicationLayout";
-    public static final String PLOT_FRAME_LAYOUT_PROPERTY = "PlotFrameLayout";
-    public static final String SAVE_LAYOUT_PROPERTY = "SaveLayout";
-    public static final String SYSTEM_STATUS_FRAME_LAYOUT_PROPERTY = "SystemStatusFrameLayout";
     public static final String STEERING_TYPE_PROPERTY = "SteeringType";
     public static final String STEERING_FILE_PROPERTY = "SteeringFile";
     public static final String STEERING_RESOURCE_PROPERTY = "SteeringResource";
@@ -66,77 +56,89 @@
     static final String[] CONFIG_PROPERTIES = AbstractModel.getPropertyNames(ConfigurationModel.class);
         
     public ConfigurationModel() {
-        this.config = new Configuration();
-    }
-
-    public ConfigurationModel(Configuration config) {
-        this.config = config;
-    }
-
-    public void setConfiguration(Configuration config) {
-        this.config = config;
-        fireAllChanged();
+        this.configuration = new Configuration();
+    }
+
+    public ConfigurationModel(Configuration configuration) {
+        this.configuration = configuration;
+        fireModelChanged();
+    }
+
+    public void setConfiguration(Configuration configuration) {
+        this.configuration = configuration;
+        fireModelChanged();
     }
 
     public Configuration getConfiguration() {
-        return this.config;
+        return this.configuration;
     }
 
     public Level getLogLevel() {
-        return Level.parse(config.get(LOG_LEVEL_PROPERTY));
+        return Level.parse(configuration.get(LOG_LEVEL_PROPERTY));
     }
 
     public void setLogLevel(Level level) {
         Level oldValue = getLogLevel();
-        config.set(LOG_LEVEL_PROPERTY, level.getName());
-        firePropertyChange(LOG_LEVEL_PROPERTY, oldValue, getLogLevel());
+        if (!oldValue.equals(level)) {
+            configuration.set(LOG_LEVEL_PROPERTY, level.getName());
+            firePropertyChange(LOG_LEVEL_PROPERTY, oldValue, getLogLevel());
+        }
     }
 
     public SteeringType getSteeringType() {
-        return SteeringType.valueOf(config.get(STEERING_TYPE_PROPERTY));
+        return SteeringType.valueOf(configuration.get(STEERING_TYPE_PROPERTY));
     }
 
     public void setSteeringType(SteeringType steeringType) {
         SteeringType oldValue = getSteeringType();
-        config.set(STEERING_TYPE_PROPERTY, steeringType.name());
-        firePropertyChange(STEERING_TYPE_PROPERTY, oldValue, getSteeringType());
+        if (!steeringType.equals(oldValue)) {
+            configuration.set(STEERING_TYPE_PROPERTY, steeringType.name());
+            firePropertyChange(STEERING_TYPE_PROPERTY, oldValue, getSteeringType());
+        }
     }
 
     public File getSteeringFile() {
-        if (config.hasKey(STEERING_FILE_PROPERTY))
-            return new File(config.get(STEERING_FILE_PROPERTY));
-        else
+        if (configuration.hasKey(STEERING_FILE_PROPERTY)) {
+            return new File(configuration.get(STEERING_FILE_PROPERTY));
+        } else {
             return null;
+        }
     }
 
     public void setSteeringFile(String steeringFile) {
         File oldValue = getSteeringFile();
-        config.set(STEERING_FILE_PROPERTY, steeringFile);
-        firePropertyChange(STEERING_FILE_PROPERTY, oldValue, getSteeringFile().getPath());
+        if (!steeringFile.equals(oldValue)) {
+            configuration.set(STEERING_FILE_PROPERTY, steeringFile);
+            firePropertyChange(STEERING_FILE_PROPERTY, oldValue, getSteeringFile().getPath());
+        }
     }
 
     public String getSteeringResource() {
-        return config.get(STEERING_RESOURCE_PROPERTY);
+        return configuration.get(STEERING_RESOURCE_PROPERTY);
     }
 
     public void setSteeringResource(String steeringResource) {
         String oldValue = getSteeringResource();
-        config.set(STEERING_RESOURCE_PROPERTY, steeringResource);
-        firePropertyChange(STEERING_RESOURCE_PROPERTY, oldValue, steeringResource);
+        if (!steeringResource.equals(oldValue)) {
+            configuration.set(STEERING_RESOURCE_PROPERTY, steeringResource);
+            firePropertyChange(STEERING_RESOURCE_PROPERTY, oldValue, steeringResource);
+        }
     }
 
     public String getDetectorName() {
-        return config.get(DETECTOR_NAME_PROPERTY);
+        return configuration.get(DETECTOR_NAME_PROPERTY);
     }
 
     public void setDetectorName(String detectorName) {
         String oldValue = getDetectorName();
-        config.set(DETECTOR_NAME_PROPERTY, detectorName);
-        firePropertyChange(DETECTOR_NAME_PROPERTY, oldValue, getDetectorName());
+        if (!detectorName.equals(oldValue)) {
+            configuration.set(DETECTOR_NAME_PROPERTY, detectorName);
+            firePropertyChange(DETECTOR_NAME_PROPERTY, oldValue, getDetectorName());
+        }
     }
     
     public String getDetectorAlias() {
-        return config.get(DETECTOR_ALIAS_PROPERTY);
+        return configuration.get(DETECTOR_ALIAS_PROPERTY);
     }
     
     public void setDetectorAlias(String detectorAlias) {
@@ -144,231 +146,277 @@
         if (hasPropertyKey(DETECTOR_ALIAS_PROPERTY)) {
             oldValue = getDetectorAlias();
         }
-        config.set(DETECTOR_ALIAS_PROPERTY, detectorAlias);
-        firePropertyChange(DETECTOR_ALIAS_PROPERTY, oldValue, getDetectorAlias());
+        if (!detectorAlias.equals(oldValue)) {
+            configuration.set(DETECTOR_ALIAS_PROPERTY, detectorAlias);
+            firePropertyChange(DETECTOR_ALIAS_PROPERTY, oldValue, getDetectorAlias());
+        }
     }
     
 
     public String getEventBuilderClassName() {
-        return config.get(EVENT_BUILDER_PROPERTY);
+        return configuration.get(EVENT_BUILDER_PROPERTY);
     }
 
     public void setEventBuilderClassName(String eventBuilderClassName) {
         String oldValue = getEventBuilderClassName();
-        config.set(EVENT_BUILDER_PROPERTY, eventBuilderClassName);
-        firePropertyChange(EVENT_BUILDER_PROPERTY, oldValue, getEventBuilderClassName());
+        if (!eventBuilderClassName.equals(oldValue)) {
+            configuration.set(EVENT_BUILDER_PROPERTY, eventBuilderClassName);
+            firePropertyChange(EVENT_BUILDER_PROPERTY, oldValue, getEventBuilderClassName());
+        }
     }
 
     public Boolean getLogToFile() {
-        return config.getBoolean(LOG_TO_FILE_PROPERTY);
-    }
-
-    public void setLogToFile(boolean logToFile) {
+        return configuration.getBoolean(LOG_TO_FILE_PROPERTY);
+    }
+
+    public void setLogToFile(Boolean logToFile) {
         Boolean oldValue = getLogToFile();
-        config.set(LOG_TO_FILE_PROPERTY, logToFile);
-        firePropertyChange(LOG_TO_FILE_PROPERTY, oldValue, getLogToFile());
+        if (!oldValue.equals(logToFile)) {
+            configuration.set(LOG_TO_FILE_PROPERTY, logToFile);
+            firePropertyChange(LOG_TO_FILE_PROPERTY, oldValue, getLogToFile());
+        }
     }
 
     public String getLogFileName() {
-        return config.get(LOG_FILE_NAME_PROPERTY);
+        return configuration.get(LOG_FILE_NAME_PROPERTY);
     }
 
     public void setLogFileName(String logFileName) {
         String oldValue = getLogFileName();
-        config.set(LOG_FILE_NAME_PROPERTY, logFileName);
-        firePropertyChange(LOG_FILE_NAME_PROPERTY, oldValue, getLogFileName());
+        if (!logFileName.equals(oldValue)) {
+            configuration.set(LOG_FILE_NAME_PROPERTY, logFileName);
+            firePropertyChange(LOG_FILE_NAME_PROPERTY, oldValue, getLogFileName());
+        }
     }
 
     public Boolean getAidaAutoSave() {
-        return config.equals(AIDA_AUTO_SAVE_PROPERTY);
-    }
-
-    public void setAidaAutoSave(boolean aidaAutoSave) {
+        return configuration.equals(AIDA_AUTO_SAVE_PROPERTY);
+    }
+
+    public void setAidaAutoSave(Boolean aidaAutoSave) {
         Boolean oldValue = getAidaAutoSave();
-        config.set(AIDA_AUTO_SAVE_PROPERTY, aidaAutoSave);
-        firePropertyChange(AIDA_AUTO_SAVE_PROPERTY, oldValue, aidaAutoSave);
+        if (!aidaAutoSave.equals(oldValue)) {
+            configuration.set(AIDA_AUTO_SAVE_PROPERTY, aidaAutoSave);
+            firePropertyChange(AIDA_AUTO_SAVE_PROPERTY, oldValue, aidaAutoSave);
+        }
     }
 
     public String getAidaFileName() {
-        return config.get(AIDA_FILE_NAME_PROPERTY);
+        return configuration.get(AIDA_FILE_NAME_PROPERTY);
     }
 
     public void setAidaFileName(String aidaFileName) {
         String oldValue = getAidaFileName();
-        config.set(AIDA_FILE_NAME_PROPERTY, aidaFileName);
-        firePropertyChange(AIDA_FILE_NAME_PROPERTY, oldValue, aidaFileName);
+        if (!aidaFileName.equals(oldValue)) {
+            configuration.set(AIDA_FILE_NAME_PROPERTY, aidaFileName);
+            firePropertyChange(AIDA_FILE_NAME_PROPERTY, oldValue, aidaFileName);
+        }
     }
 
     public Boolean getDisconnectOnError() {
-        return config.getBoolean(DISCONNECT_ON_ERROR_PROPERTY);
-    }
-
-    public void setDisconnectOnError(boolean disconnectOnError) {
+        return configuration.getBoolean(DISCONNECT_ON_ERROR_PROPERTY);
+    }
+
+    public void setDisconnectOnError(Boolean disconnectOnError) {
         Boolean oldValue = getDisconnectOnError();
-        config.set(DISCONNECT_ON_ERROR_PROPERTY, disconnectOnError);
-        firePropertyChange(DISCONNECT_ON_ERROR_PROPERTY, oldValue, getDisconnectOnError());
+        if (!disconnectOnError.equals(oldValue)) {
+            configuration.set(DISCONNECT_ON_ERROR_PROPERTY, disconnectOnError);
+            firePropertyChange(DISCONNECT_ON_ERROR_PROPERTY, oldValue, getDisconnectOnError());
+        }
     }
 
     public Boolean getDisconnectOnEndRun() {
-        return config.getBoolean(DISCONNECT_ON_END_RUN_PROPERTY);
-    }
-
-    public void setDisconnectOnEndRun(boolean disconnectOnEndRun) {
+        return configuration.getBoolean(DISCONNECT_ON_END_RUN_PROPERTY);
+    }
+
+    public void setDisconnectOnEndRun(Boolean disconnectOnEndRun) {
         Boolean oldValue = getDisconnectOnEndRun();
-        config.set(DISCONNECT_ON_END_RUN_PROPERTY, disconnectOnEndRun);
-        firePropertyChange(DISCONNECT_ON_END_RUN_PROPERTY, oldValue, getDisconnectOnEndRun());
+        if (!disconnectOnEndRun.equals(oldValue)) {
+            configuration.set(DISCONNECT_ON_END_RUN_PROPERTY, disconnectOnEndRun);
+            firePropertyChange(DISCONNECT_ON_END_RUN_PROPERTY, oldValue, getDisconnectOnEndRun());
+        }
     }
 
     public DataSourceType getDataSourceType() {
-        return DataSourceType.valueOf(config.get(DATA_SOURCE_TYPE_PROPERTY));
+        return DataSourceType.valueOf(configuration.get(DATA_SOURCE_TYPE_PROPERTY));
     }
 
     public void setDataSourceType(DataSourceType dataSourceType) {
         DataSourceType oldValue = getDataSourceType();
-        config.set(DATA_SOURCE_TYPE_PROPERTY, dataSourceType);
-        firePropertyChange(DATA_SOURCE_TYPE_PROPERTY, oldValue, getDataSourceType());
+        if (!dataSourceType.equals(oldValue)) {
+            configuration.set(DATA_SOURCE_TYPE_PROPERTY, dataSourceType);
+            firePropertyChange(DATA_SOURCE_TYPE_PROPERTY, oldValue, getDataSourceType());
+        }
     }
 
     public String getDataSourcePath() {
-        return config.get(DATA_SOURCE_PATH_PROPERTY);
+        return configuration.get(DATA_SOURCE_PATH_PROPERTY);
     }
 
     public void setDataSourcePath(String dataSourcePath) {
         String oldValue = getDataSourcePath();
-        config.set(DATA_SOURCE_PATH_PROPERTY, dataSourcePath);
-        firePropertyChange(DATA_SOURCE_PATH_PROPERTY, oldValue, getDataSourcePath());
+        if (!dataSourcePath.equals(oldValue)) {
+            configuration.set(DATA_SOURCE_PATH_PROPERTY, dataSourcePath);
+            firePropertyChange(DATA_SOURCE_PATH_PROPERTY, oldValue, getDataSourcePath());
+        }
     }
 
     public ProcessingStage getProcessingStage() {
-        if (config.get(PROCESSING_STAGE_PROPERTY) == null)
+        if (configuration.get(PROCESSING_STAGE_PROPERTY) == null)
             throw new RuntimeException(PROCESSING_STAGE_PROPERTY + " is null!!!");
-        return ProcessingStage.valueOf(config.get(PROCESSING_STAGE_PROPERTY));
+        return ProcessingStage.valueOf(configuration.get(PROCESSING_STAGE_PROPERTY));
     }
 
     public void setProcessingStage(ProcessingStage processingStage) {
         ProcessingStage oldValue = getProcessingStage();
-        config.set(PROCESSING_STAGE_PROPERTY, processingStage);
-        firePropertyChange(PROCESSING_STAGE_PROPERTY, oldValue, getProcessingStage());
+        if (!processingStage.equals(oldValue)) {
+            configuration.set(PROCESSING_STAGE_PROPERTY, processingStage);
+            firePropertyChange(PROCESSING_STAGE_PROPERTY, oldValue, getProcessingStage());
+        }
     }
 
     public String getEtName() {
-        return config.get(ET_NAME_PROPERTY);
+        return configuration.get(ET_NAME_PROPERTY);
     }
 
     public void setEtName(String etName) {
         String oldValue = getEtName();
-        config.set(ET_NAME_PROPERTY, etName);
-        firePropertyChange(ET_NAME_PROPERTY, oldValue, getEtName());
+        if (!etName.equals(oldValue)) {
+            configuration.set(ET_NAME_PROPERTY, etName);
+            firePropertyChange(ET_NAME_PROPERTY, oldValue, getEtName());
+        }
     }
 
     public String getHost() {
-        return config.get(HOST_PROPERTY);
+        return configuration.get(HOST_PROPERTY);
     }
 
     public void setHost(String host) {
         String oldValue = getHost();
-        config.set(HOST_PROPERTY, host);
-        firePropertyChange(HOST_PROPERTY, oldValue, getHost());
+        if (!host.equals(oldValue)) {
+            configuration.set(HOST_PROPERTY, host);
+            firePropertyChange(HOST_PROPERTY, oldValue, getHost());
+        }
     }
 
     public Integer getPort() {
-        return config.getInteger(PORT_PROPERTY);
-    }
-
-    public void setPort(int port) {
+        return configuration.getInteger(PORT_PROPERTY);
+    }
+
+    public void setPort(Integer port) {
         Integer oldValue = getPort();
-        config.set(PORT_PROPERTY, port);
-        firePropertyChange(PORT_PROPERTY, oldValue, getPort());
+        if (!port.equals(oldValue)) {
+            configuration.set(PORT_PROPERTY, port);
+            firePropertyChange(PORT_PROPERTY, oldValue, getPort());
+        }
     }
 
     public Boolean getBlocking() {
-        return config.getBoolean(BLOCKING_PROPERTY);
-    }
-
-    public void setBlocking(boolean blocking) {
+        return configuration.getBoolean(BLOCKING_PROPERTY);
+    }
+
+    public void setBlocking(Boolean blocking) {
         Boolean oldValue = getBlocking();
-        config.set(BLOCKING_PROPERTY, blocking);
-        firePropertyChange(BLOCKING_PROPERTY, oldValue, getBlocking());
+        if (!blocking.equals(oldValue)) {
+            configuration.set(BLOCKING_PROPERTY, blocking);
+            firePropertyChange(BLOCKING_PROPERTY, oldValue, getBlocking());
+        }
     }
 
     public Boolean getVerbose() {
-        return config.getBoolean(VERBOSE_PROPERTY);
-    }
-
-    public void setVerbose(boolean verbose) {
+        return configuration.getBoolean(VERBOSE_PROPERTY);
+    }
+
+    public void setVerbose(Boolean verbose) {
         Boolean oldValue = getVerbose();
-        config.set(VERBOSE_PROPERTY, verbose);
-        firePropertyChange(VERBOSE_PROPERTY, oldValue, getVerbose());
+        if (!verbose.equals(oldValue)) {
+            configuration.set(VERBOSE_PROPERTY, verbose);
+            firePropertyChange(VERBOSE_PROPERTY, oldValue, getVerbose());
+        }
     }
 
     public String getStationName() {
-        return config.get(STATION_NAME_PROPERTY);
+        return configuration.get(STATION_NAME_PROPERTY);
     }
 
     public void setStationName(String stationName) {
         String oldValue = getStationName();
-        config.set(STATION_NAME_PROPERTY, stationName);
-        firePropertyChange(STATION_NAME_PROPERTY, oldValue, getStationName());
+        if (!stationName.equals(oldValue)) {
+            configuration.set(STATION_NAME_PROPERTY, stationName);
+            firePropertyChange(STATION_NAME_PROPERTY, oldValue, getStationName());
+        }
     }
 
     public Integer getChunkSize() {
-        return config.getInteger(CHUNK_SIZE_PROPERTY);
-    }
-
-    public void setChunkSize(int chunkSize) {
+        return configuration.getInteger(CHUNK_SIZE_PROPERTY);
+    }
+
+    public void setChunkSize(Integer chunkSize) {
         Integer oldValue = getChunkSize();
-        config.set(CHUNK_SIZE_PROPERTY, chunkSize);
-        firePropertyChange(CHUNK_SIZE_PROPERTY, oldValue, getChunkSize());
+        if (!chunkSize.equals(oldValue)) {
+            configuration.set(CHUNK_SIZE_PROPERTY, chunkSize);
+            firePropertyChange(CHUNK_SIZE_PROPERTY, oldValue, getChunkSize());
+        }
     }
 
     public Integer getQueueSize() {
-        return config.getInteger(QUEUE_SIZE_PROPERTY);
-    }
-
-    public void setQueueSize(int queueSize) {
+        return configuration.getInteger(QUEUE_SIZE_PROPERTY);
+    }
+
+    public void setQueueSize(Integer queueSize) {
         Integer oldValue = getQueueSize();
-        config.set(QUEUE_SIZE_PROPERTY, queueSize);
-        firePropertyChange(QUEUE_SIZE_PROPERTY, oldValue, getQueueSize());
+        if (!queueSize.equals(oldValue)) {
+            configuration.set(QUEUE_SIZE_PROPERTY, queueSize);
+            firePropertyChange(QUEUE_SIZE_PROPERTY, oldValue, getQueueSize());
+        }
     }
 
     public Integer getStationPosition() {
-        return config.getInteger(STATION_POSITION_PROPERTY);
-    }
-
-    public void setStationPosition(int stationPosition) {
+        return configuration.getInteger(STATION_POSITION_PROPERTY);
+    }
+
+    public void setStationPosition(Integer stationPosition) {
         Integer oldValue = getStationPosition();
-        config.set(STATION_POSITION_PROPERTY, stationPosition);
-        firePropertyChange(STATION_POSITION_PROPERTY, oldValue, getStationPosition());
+        if (!stationPosition.equals(oldValue)) {
+            configuration.set(STATION_POSITION_PROPERTY, stationPosition);
+            firePropertyChange(STATION_POSITION_PROPERTY, oldValue, getStationPosition());
+        }
     }
 
     public Mode getWaitMode() {
-        return Mode.valueOf(config.get(WAIT_MODE_PROPERTY));
+        return Mode.valueOf(configuration.get(WAIT_MODE_PROPERTY));
     }
 
     public void setWaitMode(Mode waitMode) {
         Mode oldValue = getWaitMode();
-        config.set(WAIT_MODE_PROPERTY, waitMode.name());
-        firePropertyChange(WAIT_MODE_PROPERTY, oldValue, getWaitMode());
+        if (!waitMode.equals(oldValue)) {
+            configuration.set(WAIT_MODE_PROPERTY, waitMode.name());
+            firePropertyChange(WAIT_MODE_PROPERTY, oldValue, getWaitMode());
+        }
     }
 
     public Integer getWaitTime() {
-        return config.getInteger(WAIT_TIME_PROPERTY);
-    }
-
-    public void setWaitTime(int waitTime) {
+        return configuration.getInteger(WAIT_TIME_PROPERTY);
+    }
+
+    public void setWaitTime(Integer waitTime) {
         Integer oldValue = getWaitTime();
-        config.set(WAIT_TIME_PROPERTY, waitTime);
-        firePropertyChange(WAIT_TIME_PROPERTY, oldValue, getWaitTime());
+        if (!waitTime.equals(oldValue)) {
+            configuration.set(WAIT_TIME_PROPERTY, waitTime);
+            firePropertyChange(WAIT_TIME_PROPERTY, oldValue, getWaitTime());
+        }
     }
 
     public Integer getPrescale() {
-        return config.getInteger(PRESCALE_PROPERTY);
-    }
-
-    public void setPrescale(int prescale) {
+        return configuration.getInteger(PRESCALE_PROPERTY);
+    }
+
+    public void setPrescale(Integer prescale) {
         Integer oldValue = getPrescale();
-        config.set(PRESCALE_PROPERTY, prescale);
-        firePropertyChange(PRESCALE_PROPERTY, oldValue, getPrescale());
+        if (!prescale.equals(oldValue)) {
+            configuration.set(PRESCALE_PROPERTY, prescale);
+            firePropertyChange(PRESCALE_PROPERTY, oldValue, getPrescale());
+        }
     }
     
     public void setUserRunNumber(Integer userRunNumber) {
@@ -376,98 +424,64 @@
         if (hasPropertyKey(USER_RUN_NUMBER_PROPERTY)) {
             oldValue = getUserRunNumber();
         }
-        config.set(USER_RUN_NUMBER_PROPERTY, userRunNumber);
-        firePropertyChange(USER_RUN_NUMBER_PROPERTY, oldValue, getUserRunNumber());
+        if (!userRunNumber.equals(oldValue)) {                   
+            configuration.set(USER_RUN_NUMBER_PROPERTY, userRunNumber);
+            firePropertyChange(USER_RUN_NUMBER_PROPERTY, oldValue, getUserRunNumber());
+        }
     }
     
     public Integer getUserRunNumber() {
-        return config.getInteger(USER_RUN_NUMBER_PROPERTY);
-    }
-    
-    public void setFreezeConditions(boolean freezeConditions) {
+        return configuration.getInteger(USER_RUN_NUMBER_PROPERTY);
+    }
+    
+    public void setFreezeConditions(Boolean freezeConditions) {
         Boolean oldValue = null;
         if (hasPropertyKey(FREEZE_CONDITIONS_PROPERTY)) {
             oldValue = getFreezeConditions();
         }
-        config.set(FREEZE_CONDITIONS_PROPERTY, freezeConditions);
-        firePropertyChange(FREEZE_CONDITIONS_PROPERTY, oldValue, freezeConditions);
+        if (!freezeConditions.equals(oldValue)) {
+            configuration.set(FREEZE_CONDITIONS_PROPERTY, freezeConditions);
+            firePropertyChange(FREEZE_CONDITIONS_PROPERTY, oldValue, freezeConditions);
+        }
     }
     
     public Boolean getFreezeConditions() {
-        return config.getBoolean(FREEZE_CONDITIONS_PROPERTY);
-    }
-
-    public Boolean getSaveLayout() {
-        return config.getBoolean(SAVE_LAYOUT_PROPERTY);
-    }
-
-    public void setSaveLayout(boolean saveLayout) {
-        Boolean oldValue = getSaveLayout();
-        config.set(SAVE_LAYOUT_PROPERTY, saveLayout);
-        firePropertyChange(SAVE_LAYOUT_PROPERTY, oldValue, getSaveLayout());
-    }
-
-    public String getMonitoringApplicationLayout() {
-        return config.get(MONITORING_APPLICATION_LAYOUT_PROPERTY);
-    }
-
-    public void setMonitoringApplicationLayout(String layout) {
-        String oldValue = getMonitoringApplicationLayout();
-        config.set(MONITORING_APPLICATION_LAYOUT_PROPERTY, layout);
-        firePropertyChange(MONITORING_APPLICATION_LAYOUT_PROPERTY, oldValue, getMonitoringApplicationLayout());
-    }
-
-    public String getSystemStatusFrameLayout() {
-        return config.get(SYSTEM_STATUS_FRAME_LAYOUT_PROPERTY);
-    }
-
-    public void setSystemStatusFrameLayout(String layout) {
-        String oldValue = getSystemStatusFrameLayout();
-        config.set(SYSTEM_STATUS_FRAME_LAYOUT_PROPERTY, layout);
-        firePropertyChange(SYSTEM_STATUS_FRAME_LAYOUT_PROPERTY, oldValue, getSystemStatusFrameLayout());
-    }
-
-    public String getPlotFrameLayout() {
-        return config.get(PLOT_FRAME_LAYOUT_PROPERTY);
-    }
-
-    public void setPlotFrameLayout(String layout) {
-        String oldValue = getPlotFrameLayout();
-        config.set(PLOT_FRAME_LAYOUT_PROPERTY, layout);
-        firePropertyChange(PLOT_FRAME_LAYOUT_PROPERTY, oldValue, getPlotFrameLayout());
-    }
-    
-    public void setMaxEvents(long maxEvents) {
-        //System.out.println("ConfigurationModel.setMaxEvents - " + maxEvents);
+        return configuration.getBoolean(FREEZE_CONDITIONS_PROPERTY);
+    }
+    
+    public void setMaxEvents(Long maxEvents) {
         Long oldValue = getMaxEvents();
-        config.set(MAX_EVENTS_PROPERTY, maxEvents);
-        firePropertyChange(MAX_EVENTS_PROPERTY, oldValue, getMaxEvents());
+        if (!maxEvents.equals(oldValue)) {
+            configuration.set(MAX_EVENTS_PROPERTY, maxEvents);
+            firePropertyChange(MAX_EVENTS_PROPERTY, oldValue, getMaxEvents());
+        }
     }
     
     public Long getMaxEvents() {
-        return config.getLong(MAX_EVENTS_PROPERTY);
+        return configuration.getLong(MAX_EVENTS_PROPERTY);
     }
 
     public void remove(String property) {
         if (hasPropertyKey(property)) {
-            Object oldValue = config.get(property);
+            Object oldValue = configuration.get(property);
             if (oldValue != null) {
-                config.remove(property);
+                configuration.remove(property);
                 firePropertyChange(property, oldValue, null);
             }
         }
     }
     
     public boolean hasPropertyKey(String key) {
-        return config.hasKey(key);
+        return configuration.hasKey(key);
     }
     
     public boolean hasValidProperty(String key) {
-        return config.hasKey(key) && config.get(key) != null;
+        return configuration.hasKey(key) && configuration.get(key) != null;
     }
         
     @Override
     public String[] getPropertyNames() {
         return CONFIG_PROPERTIES;
     }
-}
+}
+    

Added: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConnectionStatusModel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConnectionStatusModel.java	(added)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/model/ConnectionStatusModel.java	Tue Mar  3 19:46:30 2015
@@ -0,0 +1,50 @@
+package org.hps.monitoring.application.model;
+
+import org.hps.monitoring.application.ConnectionStatus;
+
+/**
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ *
+ */
+public class ConnectionStatusModel extends AbstractModel {
+    
+    public static final String CONNECTION_STATUS_PROPERTY = "ConnectionStatus";
+    public static final String PAUSED_PROPERTY = "ConnectionStatus";
+    
+    static final String[] propertyNames = new String[] { 
+        CONNECTION_STATUS_PROPERTY, 
+        PAUSED_PROPERTY 
+    };
+
+    ConnectionStatus connectionStatus = ConnectionStatus.DISCONNECTED;
+    boolean paused = false;
+    
+    public String[] getPropertyNames() {
+        return propertyNames;
+    }
+    
+    public ConnectionStatus getConnectionStatus() {
+        return connectionStatus;
+    }
+    
+    public void setConnectionStatus(ConnectionStatus connectionStatus) {
+        if (connectionStatus != this.connectionStatus) {
+            ConnectionStatus oldValue = connectionStatus;
+            this.connectionStatus = connectionStatus;
+            firePropertyChange(CONNECTION_STATUS_PROPERTY, oldValue, this.connectionStatus);
+        }
+    }        
+    
+    public boolean getPaused() {
+        return paused;
+    }
+    
+    public void setPaused(boolean paused) {
+        if (paused != this.paused) {
+            boolean oldValue = this.paused;
+            this.paused = paused;
+            firePropertyChange(PAUSED_PROPERTY, oldValue, paused);
+        }
+    }
+}

Added: java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/util/ResourceUtil.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/util/ResourceUtil.java	(added)
+++ java/branches/monitoring-app-HPSJAVA-442/src/main/java/org/hps/monitoring/application/util/ResourceUtil.java	Tue Mar  3 19:46:30 2015
@@ -0,0 +1,119 @@
+package org.hps.monitoring.application.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.hps.record.LCSimEventBuilder;
+import org.reflections.Reflections;
+
+/**
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ *
+ */
+public class ResourceUtil {
+
+    private ResourceUtil() {        
+    }
+    
+    /**
+     * Get the files with extension 'lcsim' from all loaded jar files.
+     * @param packageName The package name for filtering the resources.
+     * @return A list of embedded steering file resources.
+     */
+    public static String[] findSteeringResources(String packageName) {
+        List<String> resources = new ArrayList<String>();
+        URL url = ResourceUtil.class.getResource("ResourceUtil.class");
+        String scheme = url.getProtocol();
+        if (!"jar".equals(scheme)) {
+            throw new IllegalArgumentException("Unsupported scheme.  Only jar is allowed.");
+        }
+        try {
+            JarURLConnection con = (JarURLConnection) url.openConnection();
+            JarFile archive = con.getJarFile();
+            Enumeration<JarEntry> entries = archive.entries();
+            while (entries.hasMoreElements()) {
+                JarEntry entry = entries.nextElement();
+                if (entry.getName().endsWith(".lcsim") && entry.getName().contains(packageName)) {
+                    resources.add(entry.getName());
+                }
+            }
+            archive.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        java.util.Collections.sort(resources);
+        String[] arr = new String[resources.size()];
+        for (int i = 0; i < arr.length; i++) {
+            arr[i] = resources.get(i);
+        }
+        return arr;
+    }
+    
+    /**
+     * Find all classes that implement {@link org.hps.record.LCSimEventBuilder} and return
+     * a list of their canonical names.
+     * @return The list of classes implementing LCSimEventBuilder.
+     */
+    public static String[] findEventBuilderClassNames() {
+        Reflections reflections = new Reflections("org.hps");
+        Set<Class<? extends LCSimEventBuilder>> subTypes = reflections.getSubTypesOf(LCSimEventBuilder.class);
+        Set<String> classNames = new HashSet<String>();
+        for (Class<? extends LCSimEventBuilder> type : subTypes) {
+            classNames.add(type.getCanonicalName());
+        }
+        return classNames.toArray(new String[classNames.size()]);        
+    }
+ 
+    /**
+     * Find a list of available detector names.
+     * Only those detectors that have names starting with "HPS" in their
+     * detector.properties files will be returned.
+     * @return The list of available detector names.
+     */
+    public static String[] findDetectorNames() {
+        ClassLoader classLoader = ResourceUtil.class.getClassLoader();
+        List<String> detectorNames = new ArrayList<String>();
+        URL url = ResourceUtil.class.getResource("ResourceUtil.class");
+        String protocol = url.getProtocol();
+        if (!"jar".equals(protocol)) {
+            throw new RuntimeException("Unsupported URL protocol: " + url.getProtocol());
+        }
+        try {
+            JarURLConnection con = (JarURLConnection) url.openConnection();
+            JarFile archive = con.getJarFile();
+            Enumeration<JarEntry> entries = archive.entries();
+            while (entries.hasMoreElements()) {
+                JarEntry entry = entries.nextElement();
+                if (entry.getName().endsWith("detector.properties")) {
+                    InputStream inputStream = classLoader.getResourceAsStream(entry.getName());
+                    if (inputStream == null) {
+                        throw new RuntimeException("Failed to load jar entry: " + entry.getName());
+                    }
+                    Properties properties = new Properties();
+                    properties.load(inputStream);
+                    String detectorName = properties.getProperty("name");
+                    if (detectorName.startsWith("HPS")) {
+                        detectorNames.add(detectorName);
+                    }
+                }
+            }
+            archive.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        Collections.sort(detectorNames);
+        return detectorNames.toArray(new String[detectorNames.size()]);
+    }        
+}

Added: java/branches/monitoring-app-HPSJAVA-442/src/main/resources/monitoringButtonGraphics/connected-128.png
 =============================================================================
Binary file - no diff available.

Added: java/branches/monitoring-app-HPSJAVA-442/src/main/resources/monitoringButtonGraphics/disconnected-128.png
 =============================================================================
Binary file - no diff available.

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use