package limitedwip.common.settings; import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.util.Disposer; import limitedwip.common.PluginId; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; public class LimitedWipConfigurable implements SearchableConfigurable { private static final String EXTENSION_POINT_NAME = PluginId.value + ".settingsListener"; private SettingsForm settingsForm; @Nullable @Override public JComponent createComponent() { LimitedWIPSettings settings = ServiceManager.getService(LimitedWIPSettings.class); settingsForm = new SettingsForm(settings); return settingsForm.root; } @Override public boolean isModified() { return settingsForm != null && settingsForm.isModified(); } @Override public void apply() throws ConfigurationException { LimitedWIPSettings newSettings = settingsForm.applyChanges(); notifySettingsListeners(newSettings); } @Override public void reset() { settingsForm.resetChanges(); settingsForm.updateUIFromState(); } @Override public void disposeUIResources() { settingsForm = null; } @Nls @Override public String getDisplayName() { return PluginId.displayName; } @NotNull @Override public String getId() { return PluginId.displayName; } @Nullable @Override public Runnable enableSearch(String option) { return null; } @Nullable @Override public String getHelpTopic() { return null; } private void notifySettingsListeners(LimitedWIPSettings settings) { final ExtensionPoint<Listener> extensionPoint = Extensions.getRootArea().getExtensionPoint(EXTENSION_POINT_NAME); for (Listener listener : extensionPoint.getExtensions()) { listener.onSettingsUpdate(settings); } } public static void registerSettingsListener(Disposable disposable, final Listener listener) { final ExtensionPoint<Listener> extensionPoint = Extensions.getRootArea().getExtensionPoint(EXTENSION_POINT_NAME); extensionPoint.registerExtension(listener); Disposer.register(disposable, new Disposable() { @Override public void dispose() { extensionPoint.unregisterExtension(listener); } }); } public interface Listener { void onSettingsUpdate(LimitedWIPSettings settings); } }