001package jmri.jmrix.sprog.update;
002
003import jmri.jmrix.sprog.SprogSystemConnectionMemo;
004import jmri.util.swing.JmriJOptionPane;
005
006/**
007 * Display the firmware version of the attached SPROG hardware.
008 *
009 * @author Andrew Crosland Copyright (C) 2008
010 */
011public class SprogVersionFrame extends jmri.util.JmriJFrame implements SprogVersionListener {
012
013    private SprogSystemConnectionMemo _memo = null;
014    private volatile boolean disposed = false;
015
016    public SprogVersionFrame(SprogSystemConnectionMemo memo) {
017        super();
018        _memo = memo;
019    }
020
021    /** 
022     * {@inheritDoc}
023     */
024    @Override
025    public void initComponents() {
026        setTitle(Bundle.getMessage("SprogVersionTitle"));
027
028        // add help menu to window
029        addHelpMenu("package.jmri.jmrix.sprog.update.SprogVersionFrame", true);
030
031        // Start the query
032        SprogVersionQuery query = _memo.getSprogVersionQuery();
033        query.requestVersion(this);
034    }
035
036    /**
037     * Handle the version reply. May be called on any thread (serial event
038     * thread or Swing timer thread), so dispatch to the EDT to show the dialog
039     * and dispose the frame. Not synchronized — dispatching via
040     * runOnGUIEventually ensures neither the calling thread nor the EDT blocks
041     * waiting for a lock held by the other.
042     * {@inheritDoc}
043     */
044    @Override
045    public void notifyVersion(SprogVersion v) {
046        log.debug("Version {} notified", v.toString());
047        jmri.util.ThreadingUtil.runOnGUIEventually(() -> {
048            if (!disposed) {
049                JmriJOptionPane.showMessageDialog(SprogVersionFrame.this,
050                        Bundle.getMessage("SprogVersionDialogString", v.toString()),
051                        Bundle.getMessage("SprogVersionTitle"), JmriJOptionPane.INFORMATION_MESSAGE);
052                setVisible(false);
053                dispose();
054            }
055        });
056    }
057
058    /**
059     * Removes SprogVersionListener.
060     * {@inheritDoc}
061     */
062    @Override
063    public void dispose() {
064        disposed = true;
065        _memo.getSprogVersionQuery().removeSprogVersionListener(this);
066        super.dispose();
067    }
068
069    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(SprogVersionFrame.class);
070}