package jmri.jmrix.openlcb;
import java.util.List;
import java.util.ResourceBundle;
import jmri.GlobalProgrammerManager;
import jmri.InstanceManager;
import org.openlcb.OlcbInterface;
/**
* Lightweight class to denote that a system is active, and provide general
* information.
*
* Objects of specific subtypes are registered in the instance manager to
* activate their particular system.
*
* @author Bob Jacobsen Copyright (C) 2015
*/
public class OlcbSystemConnectionMemoScaffold extends jmri.jmrix.can.CanSystemConnectionMemo {
public OlcbSystemConnectionMemoScaffold() {
//super("M", "OpenLCB");
register(); // registers general type
InstanceManager.store(this, OlcbSystemConnectionMemoScaffold.class); // also register as specific type
}
public OlcbSystemConnectionMemoScaffold(String prefix) {
super(prefix);
register(); // registers general type
InstanceManager.store(this, OlcbSystemConnectionMemoScaffold.class); // also register as specific type
}
final jmri.jmrix.swing.ComponentFactory cf = null;
/**
* Tells which managers this class provides.
* {@inheritDoc}
*/
@Override
public boolean provides(Class> type) {
if (getDisabled()) {
return false;
}
if (type.equals(jmri.GlobalProgrammerManager.class)) {
if (programmerManager == null) {
return false;
}
return programmerManager.isGlobalProgrammerAvailable();
}
if (type.equals(jmri.AddressedProgrammerManager.class)) {
if (programmerManager == null) {
return false;
}
return programmerManager.isAddressedModePossible();
}
if (type.equals(jmri.SensorManager.class)) {
return true;
}
if (type.equals(jmri.TurnoutManager.class)) {
return true;
}
if (type.equals(jmri.ThrottleManager.class)) {
return true;
}
return super.provides(type);
}
@SuppressWarnings("unchecked")
@Override
public T get(Class T) {
if (getDisabled()) {
return null;
}
if (T.equals(jmri.GlobalProgrammerManager.class)) {
if (programmerManager == null) {
return null;
}
if (!programmerManager.isGlobalProgrammerAvailable()) {
return null;
}
return (T)programmerManager;
}
if (T.equals(jmri.AddressedProgrammerManager.class)) {
if (programmerManager == null) {
return null;
}
if (!programmerManager.isAddressedModePossible()) {
return null;
}
return (T)programmerManager;
}
if (T.equals(jmri.SensorManager.class)) {
return (T) getSensorManager();
}
if (T.equals(jmri.TurnoutManager.class)) {
return (T) getTurnoutManager();
}
if (T.equals(jmri.ThrottleManager.class)) {
return (T) getThrottleManager();
}
if (T.equals(OlcbInterface.class)) {
return (T) getInterface();
}
return super.get(T);
}
/**
* Configure the common managers for the connection. This puts the common
* manager config in one place.
*/
@Override
public void configureManagers() {
InstanceManager.setSensorManager(getSensorManager());
InstanceManager.setTurnoutManager(getTurnoutManager());
InstanceManager.store(getThrottleManager(), jmri.ThrottleManager.class);
}
/*
* Provides access to the ... for this particular connection.
*/
protected OlcbProgrammerManager programmerManager;
public OlcbProgrammerManager getProgrammerManager() {
return programmerManager;
}
public void setProgrammerManager(OlcbProgrammerManager p) {
programmerManager = p;
if (p.isAddressedModePossible()) {
InstanceManager.store(p, jmri.AddressedProgrammerManager.class);
}
if (p.isGlobalProgrammerAvailable()) {
InstanceManager.store(p, GlobalProgrammerManager.class);
}
}
protected OlcbTurnoutManager turnoutManager;
public OlcbTurnoutManager getTurnoutManager() {
if (getDisabled()) {
return null;
}
if (turnoutManager == null) {
turnoutManager = new OlcbTurnoutManager(this);
}
return turnoutManager;
}
protected OlcbThrottleManager throttleManager;
public OlcbThrottleManager getThrottleManager() {
if (getDisabled()) {
return null;
}
if (throttleManager == null) {
throttleManager = new OlcbThrottleManager(this);
}
return throttleManager;
}
protected OlcbSensorManager sensorManager;
public OlcbSensorManager getSensorManager() {
if (getDisabled()) {
return null;
}
if (sensorManager == null) {
sensorManager = new OlcbSensorManager(this);
}
return sensorManager;
}
protected OlcbInterface olcbInterface;
public OlcbInterface getInterface() {
if (olcbInterface != null) {
return olcbInterface;
}
// We check if someone instantiated an OlcbConfigurationManager in the test or the fixture. If so, we use the
// interface from that object. (The superclass CanSystemConnectionMemo does instantiate an object like this and
// forwards the get() calls to it, which does find the OlcbInterface there.)
List l = InstanceManager.getList(OlcbConfigurationManager.class);
if (!l.isEmpty()) {
return l.get(l.size() - 1).getInterface();
}
return null;
}
public void setInterface(OlcbInterface iface) {
olcbInterface = iface;
}
@Override
protected ResourceBundle getActionModelResourceBundle() {
return ResourceBundle.getBundle("jmri.jmrix.openlcb.OlcbActionListBundle");
}
@Override
public void dispose() {
InstanceManager.deregister(this, OlcbSystemConnectionMemoScaffold.class);
if (cf != null) {
InstanceManager.deregister(cf, jmri.jmrix.swing.ComponentFactory.class);
}
if (turnoutManager != null) {
InstanceManager.deregister(turnoutManager, OlcbTurnoutManager.class);
}
if (sensorManager != null) {
InstanceManager.deregister(sensorManager, OlcbSensorManager.class);
}
if (throttleManager != null) {
InstanceManager.deregister(throttleManager, OlcbThrottleManager.class);
}
if (programmerManager != null) {
InstanceManager.deregister(programmerManager, jmri.AddressedProgrammerManager.class);
InstanceManager.deregister(programmerManager, GlobalProgrammerManager.class);
}
super.dispose();
}
}