View Javadoc

1   package org.lsst.ccs.plugin.jas3.console;
2   
3   import java.io.OutputStreamWriter;
4   import java.io.PrintWriter;
5   import javax.swing.JDialog;
6   import javax.swing.JOptionPane;
7   import javax.swing.JScrollPane;
8   import javax.swing.SwingUtilities;
9   import org.freehep.application.studio.Studio;
10  import org.freehep.jas.plugin.console.Console;
11  import org.lsst.ccs.bus.BusMessage;
12  import org.lsst.ccs.bus.DetailLevel;
13  import org.lsst.ccs.bus.StatusListener;
14  
15  /**
16   * Listen for alarms on the status bus, and if/when found popup an alarm dialog
17   * @author tonyj
18   */
19  class AlarmListener implements StatusListener, Runnable {
20  
21      private final Studio studio;
22      private JDialog dialog;
23      private final Console console;
24      private final PrintWriter printWriter;
25  
26      public AlarmListener(Studio studio) {
27          this.studio = studio;
28          console = new Console();
29          printWriter = new PrintWriter(new OutputStreamWriter(console.getOutputStream(null)),true);
30      }
31      
32      
33      @Override
34      public void onStatus(BusMessage bm) {
35          // FIXME: What is the right test for alarm?
36          if (bm.getDetailLevel() == DetailLevel.SEVERE) {
37              ensureDialogVisible();
38              printWriter.println(bm);
39          }
40      }
41  
42      @Override
43      public void run() {
44          if (dialog == null) {
45              dialog = createDialog();
46          }
47          if (!dialog.isVisible()) {
48              dialog.setVisible(true);
49          }      
50      }
51  
52      private void ensureDialogVisible() {
53          SwingUtilities.invokeLater(this);
54      }
55  
56      private JDialog createDialog() {
57          JOptionPane pane = new JOptionPane();
58          pane.setMessageType(JOptionPane.ERROR_MESSAGE);
59          pane.setOptions(new Object[]{"Clear Alarm"});
60          pane.setMessage(new JScrollPane(console));
61          JDialog dlg = pane.createDialog(studio, "Alarm");
62          dlg.setResizable(true);
63          dlg.setModal(false);
64          dlg.setAlwaysOnTop(true);
65          return dlg;
66      }
67  }