001package jmri.jmrix.mrc;
002
003import java.util.Comparator;
004import java.util.ResourceBundle;
005
006import jmri.*;
007import jmri.util.NamedBeanComparator;
008
009/**
010 * Lightweight class to denote that a system is active, and provide general
011 * information.
012 * <p>
013 * Objects of specific subtypes are registered in the instance manager to
014 * activate their particular system.
015 *
016 * @author Ken Cameron Copyright (C) 2014
017 * @author Kevin Dickerson Copyright (C) 2014
018 *
019 */
020public class MrcSystemConnectionMemo extends jmri.jmrix.DefaultSystemConnectionMemo {
021
022    public MrcSystemConnectionMemo() {
023        super("M", "MRC"); // NOI18N
024        register(); // registers general type
025        InstanceManager.store(this, MrcSystemConnectionMemo.class); // also register as specific type
026
027        // create and register the ComponentFactory
028        InstanceManager.store(componentFactory = new jmri.jmrix.mrc.swing.MrcComponentFactory(this),
029                jmri.jmrix.swing.ComponentFactory.class);
030    }
031
032    jmri.jmrix.swing.ComponentFactory componentFactory = null;
033
034    /**
035     * Provides access to the TrafficController for this particular connection.
036     *
037     * @return current traffic controller for this connection
038     */
039    public MrcTrafficController getMrcTrafficController() {
040        if (mrcTrafficController == null) log.error("found tc null in request", new Exception("traceback"));
041        return mrcTrafficController;
042    }
043    private MrcTrafficController mrcTrafficController;
044
045    public void setMrcTrafficController(MrcTrafficController tc) {
046        mrcTrafficController = tc;
047        if (tc != null) {
048            tc.setAdapterMemo(this);
049        }
050    }
051
052    public MrcProgrammerManager getProgrammerManager() {
053        //Do not want to return a programmer if the system is disabled
054        if (getDisabled()) {
055            return null;
056        }
057        return (MrcProgrammerManager)classObjectMap.computeIfAbsent(MrcProgrammerManager.class,
058                (Class<?> c) -> new MrcProgrammerManager(new MrcProgrammer(this), this));
059    }
060
061    public void setProgrammerManager(MrcProgrammerManager p) {
062        store(p, MrcProgrammerManager.class);
063    }
064
065    /**
066     * Configure the common managers for MRC connections. This puts the common
067     * manager config in one place.
068     */
069    public void configureManagers() {
070        PowerManager powerManager = new jmri.jmrix.mrc.MrcPowerManager(this);
071        store(powerManager,PowerManager.class);
072        InstanceManager.store(powerManager, PowerManager.class);
073
074        TurnoutManager turnoutManager = new jmri.jmrix.mrc.MrcTurnoutManager(this);
075        store(turnoutManager,TurnoutManager.class);
076        InstanceManager.setTurnoutManager(turnoutManager);
077
078        ThrottleManager throttleManager = new jmri.jmrix.mrc.MrcThrottleManager(this);
079        store(throttleManager,ThrottleManager.class);
080        InstanceManager.setThrottleManager(throttleManager);
081
082        if (getProgrammerManager().isAddressedModePossible()) {
083            store(getProgrammerManager(),AddressedProgrammerManager.class);
084            InstanceManager.store(getProgrammerManager(), AddressedProgrammerManager.class);
085        }
086        if (getProgrammerManager().isGlobalProgrammerAvailable()) {
087            store(getProgrammerManager(),GlobalProgrammerManager.class);
088            InstanceManager.store(getProgrammerManager(), GlobalProgrammerManager.class);
089        }
090
091        ClockControl clockManager = new jmri.jmrix.mrc.MrcClockControl(getMrcTrafficController(), getSystemPrefix());
092        store(clockManager,ClockControl.class);
093        InstanceManager.store(clockManager, jmri.ClockControl.class);
094        InstanceManager.setDefault(jmri.ClockControl.class, clockManager);
095
096    }
097
098    public MrcPowerManager getPowerManager() {
099        return (MrcPowerManager)get(PowerManager.class);
100    }
101
102    public MrcTurnoutManager getTurnoutManager() {
103        return (MrcTurnoutManager)get(TurnoutManager.class);
104    }
105
106    public MrcThrottleManager getThrottleManager() {
107        return (MrcThrottleManager)get(ThrottleManager.class);
108    }
109
110    public MrcClockControl getClockControl() {
111        return (MrcClockControl)get(ClockControl.class);
112    }
113
114    @Override
115    protected ResourceBundle getActionModelResourceBundle() {
116        return ResourceBundle.getBundle("jmri.jmrix.mrc.MrcActionListBundle"); //NO18N
117    }
118
119    @Override
120    public <B extends NamedBean> Comparator<B> getNamedBeanComparator(Class<B> type) {
121        return new NamedBeanComparator<>();
122    }
123
124    @Override
125    public void dispose() {
126        mrcTrafficController = null;
127        InstanceManager.deregister(this, MrcSystemConnectionMemo.class);
128        if (componentFactory != null) {
129            InstanceManager.deregister(componentFactory, jmri.jmrix.swing.ComponentFactory.class);
130        }
131
132        super.dispose();
133    }
134
135    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MrcSystemConnectionMemo.class.getName());
136
137}