001package jmri.swing;
002
003import java.util.List;
004import javax.swing.ButtonGroup;
005import javax.swing.JMenu;
006import javax.swing.JMenuItem;
007import javax.swing.JRadioButtonMenuItem;
008import jmri.InstanceManager;
009import jmri.PowerManager;
010
011/**
012 * Create a menu for selecting the Power Manager to use
013 *
014 * @author Bob Jacobsen Copyright 2010
015 * @since 2.9.5
016 */
017abstract public class PowerManagerMenu extends JMenu {
018
019    /**
020     * Get the currently selected manager.
021     *
022     * @return null unless overridden by subclass
023     */
024    // should this be abstract?
025    public PowerManager get() {
026        return null;
027    }
028
029    abstract protected void choiceChanged();
030
031    /**
032     * Create a PowerManager menu.
033     */
034    public PowerManagerMenu() {
035        super();
036
037        ButtonGroup group = new ButtonGroup();
038
039        // label this menu
040        setText(Bundle.getMessage("MenuConnection")) ;
041
042        // now add an item for each available manager
043        List<PowerManager> managers = InstanceManager.getList(PowerManager.class);
044        for (PowerManager mgr : managers) {
045            if (mgr != null) {
046                JMenuItem item = new JRadioButtonMenuItem(mgr.getUserName());
047                add(item);
048                group.add(item);
049                items.add(item);
050                item.addActionListener((java.awt.event.ActionEvent e) -> {
051                    choiceChanged();
052                });
053            }
054        }
055
056        setDefault();
057    }
058
059    List<JMenuItem> items = new java.util.ArrayList<>();
060
061    void setDefault() {
062        // name of default
063        PowerManager manager = InstanceManager.getNullableDefault(jmri.PowerManager.class);
064        if (manager == null) {
065            return;
066        }
067        String defaultMgr = manager.getUserName();
068        for (JMenuItem item : items) {
069            if (defaultMgr.equals(item.getActionCommand())) {
070                item.setSelected(true);
071            }
072        }
073    }
074
075    public PowerManager getManager() {
076        // start with default
077        PowerManager manager = InstanceManager.getNullableDefault(jmri.PowerManager.class);
078        if (manager == null) {
079            return null;
080        }
081        String name = manager.getUserName();
082
083        // find active name
084        for (JMenuItem item : items) {
085            if (item.isSelected()) {
086                name = item.getActionCommand();
087                break;
088            }
089        }
090        // find PowerManager and return
091        List<PowerManager> managers = InstanceManager.getList(PowerManager.class);
092        for (PowerManager mgr : managers) {
093            if (name.equals(mgr.getUserName())) {
094                return mgr;
095            }
096        }
097        // should not happen
098        return null;
099    }
100}