@SuppressWarnings("rawtypes")
  protected void addEPChangesListener(@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);
    }
  }
@SuppressWarnings("rawtypes")
  protected void addEPChangesListener(@NotNull ConfigurableWrapper wrapper)