package ee.edio.garmin.configuration;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModuleExtension;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import ee.edio.garmin.jps.model.JpsMonkeyModelSerializerExtension;
import ee.edio.garmin.runconfig.TargetDevice;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class TargetDeviceModuleExtension extends ModuleExtension<TargetDeviceModuleExtension> {
// must be same as fields in JpsMonkeyModuleProperties
private static final String TARGET_DEVICE_ID_ATTRIBUTE = JpsMonkeyModelSerializerExtension.MODULE_TARGET_DEVICE_ID_ATTRIBUTE;
private Module myModule;
private final boolean myWritable;
private static final Logger LOG = Logger.getInstance("#" + TargetDeviceModuleExtension.class.getName());
private TargetDevice myTargetDevice;
private final TargetDeviceModuleExtension mySource;
public static TargetDeviceModuleExtension getInstance(final Module module) {
return ModuleRootManager.getInstance(module).getModuleExtension(TargetDeviceModuleExtension.class);
}
public TargetDeviceModuleExtension(Module module) {
myModule = module;
mySource = null;
myWritable = false;
}
public TargetDeviceModuleExtension(final TargetDeviceModuleExtension source, boolean writable) {
myWritable = writable;
myModule = source.myModule;
myTargetDevice = source.myTargetDevice;
mySource = source;
}
@Nullable
public TargetDevice getTargetDevice() {
return myTargetDevice;
}
public void setTargetDevice(final TargetDevice targetDevice) {
LOG.assertTrue(myWritable, "Writable model can be retrieved from writable ModifiableRootModel");
myTargetDevice = targetDevice;
}
@Override
public void readExternal(@NotNull Element element) throws InvalidDataException {
final String targetDeviceId = element.getAttributeValue(TARGET_DEVICE_ID_ATTRIBUTE);
if (targetDeviceId != null) {
try {
myTargetDevice = TargetDevice.fromId(targetDeviceId);
} catch (IllegalArgumentException e) {
//bad value was stored
}
} else {
myTargetDevice = null;
}
}
@Override
public void writeExternal(final Element element) throws WriteExternalException {
if (myTargetDevice != null) {
element.setAttribute(TARGET_DEVICE_ID_ATTRIBUTE, myTargetDevice.getId());
}
}
@Override
public ModuleExtension getModifiableModel(final boolean writable) {
return new TargetDeviceModuleExtension(this, writable);
}
@Override
public void commit() {
if (mySource != null && mySource.myTargetDevice != myTargetDevice) {
mySource.myTargetDevice = myTargetDevice;
}
}
@Override
public boolean isChanged() {
return mySource != null && mySource.myTargetDevice != myTargetDevice;
}
@Override
public void dispose() {
myModule = null;
myTargetDevice = null;
}
}