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
17
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
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 }