package nbtool.gui.utilitypanes;
import java.awt.Rectangle;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Vector;
import nbtool.util.Center;
import nbtool.util.Center.NBToolShutdownListener;
import nbtool.util.Debug;
import nbtool.util.UserSettings;
import nbtool.util.UserSettings.DisplaySettings;
public class UtilityManager {
/* adding a field here that
* ** extends UtilityParent
* ** is 'public static final'
* is enough to get it displayed. This is also the preferred way of added utilities to the display. */
public static final LogToViewUtility LogToViewUtility = new LogToViewUtility();
public static final YUVColorUtility YUVColorUtility = new YUVColorUtility();
public static final ThreadStateUtility ThreadStateUtility = new ThreadStateUtility();
public static final WorldViewUtility WorldViewUtility = new WorldViewUtility();
public static final BroadcastUtility BroadcastUtility = new BroadcastUtility();
public static final ReachableRobots ReachableRobots = new ReachableRobots();
public static final CameraOffsetsUtility CameraOffsetsUtility = new CameraOffsetsUtility();
public static final CameraSettingsUtility CameraSettingsUtility = new CameraSettingsUtility();
public static final ColorCalibrationUtility ColorCalibrationUtility = new ColorCalibrationUtility();
public static final BallTestUtility BallTestUtility = new BallTestUtility();
public static final WhistleTestUtility WhistleTestUtility = new WhistleTestUtility();
//Unused at the moment – comment out to re-enable.
// public static final SyntheticImageUtility SyntheticImageUtility = new SyntheticImageUtility();
// public static final ReplayUtility ReplayUtility = new ReplayUtility();
public static final UtilityParent[] utilities = findUtilityFields();
private static UtilityParent[] findUtilityFields() {
Field[] fields = UtilityManager.class.getDeclaredFields();
Vector<UtilityParent> found = new Vector<>();
for (Field f : fields) {
int mod = f.getModifiers();
if (Modifier.isFinal(mod) &&
Modifier.isStatic(mod) &&
Modifier.isPublic(mod)) {
Object val = null;
try {
val = f.get(null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (val instanceof UtilityParent) {
Debug.info("UtilityManager found field of class %s...", val.getClass().getName());
found.add((UtilityParent) val);
}
}
}
return found.toArray(new UtilityParent[0]);
}
static {
Center.listen(new NBToolShutdownListener() {
@Override
public void nbtoolShutdownCallback() {
for (UtilityParent up : utilities) {
if (up.previouslySupplied != null) {
Rectangle bnds = up.previouslySupplied.getBounds();
UserSettings.BOUNDS_MAP.put(up.preferenceKey(), new DisplaySettings(bnds, null, 0));
}
}
}
});
}
}