public SubclassGotoClassModel(
     @NotNull final Project project,
     @NotNull final AbstractTreeClassChooserDialog<T> treeClassChooserDialog,
     @NotNull BaseClassInheritorsProvider<T> inheritorsProvider) {
   super(project, treeClassChooserDialog);
   myInheritorsProvider = inheritorsProvider;
   assert myInheritorsProvider.getBaseClass() != null;
 }
 @Override
 protected boolean isAccepted(T aClass) {
   if (myFastMode) {
     return getTreeClassChooserDialog().getFilter().isAccepted(aClass);
   } else {
     return (aClass == getTreeClassChooserDialog().getBaseClass()
             || myInheritorsProvider.isInheritorOfBaseClass(aClass))
         && getTreeClassChooserDialog().getFilter().isAccepted(aClass);
   }
 }
    @NotNull
    @Override
    public String[] getNames(boolean checkBoxState) {
      if (!myFastMode) {
        return myInheritorsProvider.getNames();
      }
      final List<String> names = new ArrayList<String>();

      myFastMode =
          myInheritorsProvider
              .searchForInheritorsOfBaseClass()
              .forEach(
                  new Processor<T>() {
                    private long start = System.currentTimeMillis();

                    @Override
                    public boolean process(T aClass) {
                      if (System.currentTimeMillis() - start > 500) {
                        return false;
                      }
                      if ((getTreeClassChooserDialog().getFilter().isAccepted(aClass))
                          && aClass.getName() != null) {
                        names.add(aClass.getName());
                      }
                      return true;
                    }
                  });
      if (!myFastMode) {
        return myInheritorsProvider.getNames();
      }
      if ((getTreeClassChooserDialog().getFilter().isAccepted(myInheritorsProvider.getBaseClass()))
          && myInheritorsProvider.getBaseClass().getName() != null) {
        names.add(myInheritorsProvider.getBaseClass().getName());
      }
      return ArrayUtil.toStringArray(names);
    }