void (@NotNull ConfigurableWrapper wrapper) { //for the dynamic configurations we have to update the whole tree if (wrapper.getExtensionPoint().dynamic) return; Configurable.WithEpDependencies configurable = ConfigurableWrapper.cast(Configurable.WithEpDependencies.class, wrapper); if (configurable != null && !myListeners.containsKey(wrapper)) { Disposable disposable = Disposer.newDisposable(); Collection<BaseExtensionPointName<?>> dependencies = configurable.getDependencies(); Runnable listener = () -> { ApplicationManager.getApplication().invokeLater(() -> { //dispose resources -> reset nested component wrapper.disposeUIResources(); resetValue(wrapper); }, ModalityState.stateForComponent(this), (__) -> this.isDisposed()); }; for (BaseExtensionPointName dependency : dependencies) { if (dependency instanceof ExtensionPointName) { ((ExtensionPointName)dependency).addChangeListener(listener, disposable); } else if (dependency instanceof ProjectExtensionPointName) { Project project = wrapper.getProject(); assert project != null; ((ProjectExtensionPointName)dependency).addChangeListener(project, listener, disposable); } } myListeners.put(wrapper, disposable); } }