package zielu.gittoolbox.ui.config;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.options.BaseConfigurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.util.Computable;
import com.intellij.util.ui.UIUtil;
import javax.swing.JComponent;
import org.jetbrains.annotations.Nullable;
public abstract class GtConfigurableBase
<FORM extends GtFormUi, CONFIG extends PersistentStateComponent> extends BaseConfigurable {
private volatile FORM form;
protected abstract FORM createForm();
protected abstract CONFIG getConfig();
protected abstract void setFormState(FORM form, CONFIG config);
protected abstract boolean checkModified(FORM form, CONFIG config);
protected abstract void doApply(FORM form, CONFIG config) throws ConfigurationException;
protected void dispose() {
}
protected final FORM getForm() {
return form;
}
private synchronized void initComponent() {
if (form == null) {
form = UIUtil.invokeAndWaitIfNeeded(new Computable<FORM>() {
@Override
public FORM compute() {
FORM form = createForm();
form.init();
return form;
}
});
}
}
@Nullable
@Override
public final JComponent createComponent() {
initComponent();
setFormState(getForm(), getConfig());
return form.getContent();
}
@Override
public final boolean isModified() {
setModified(checkModified(getForm(), getConfig()));
return super.isModified();
}
@Override
public final void apply() throws ConfigurationException {
initComponent();
doApply(getForm(), getConfig());
}
@Override
public final void reset() {
initComponent();
setFormState(getForm(), getConfig());
}
@Override
public synchronized void disposeUIResources() {
dispose();
if (form != null) {
form.dispose();
}
form = null;
}
}