@Override
  public NodeDescriptor<?>[] createChildElements(@NotNull Project project, @NotNull NodeDescriptor nodeDescriptor) {
    Object nodeDescriptorElement = nodeDescriptor.getElement();
    if (root.equals(nodeDescriptor)) {
      ArrayList<NodeDescriptor> list = new ArrayList<>();
      for (GroupDescriptor group : myGroups) {
        if (!group.myTypes.isEmpty()) {
          list.add(group);
        }
      }
      list.addAll(Arrays.asList(convertToDescriptors(project, nodeDescriptor, myTypesToShow.toArray())));
      if (!myOtherTypes.isEmpty()) {
        list.add(other);
      }
      return list.toArray(NodeDescriptor.getEmptyArray());
    }
    else if (nodeDescriptor instanceof GroupDescriptor) {
      ArrayList<NodeDescriptor> list = new ArrayList<>();
      for (ConfigurationType type : ((GroupDescriptor)nodeDescriptor).myTypes) {
        list.add(createDescriptor(project, type, nodeDescriptor));
      }
      return list.toArray(NodeDescriptor.getEmptyArray());
    }
    else if (other.equals(nodeDescriptor)) {
      return convertToDescriptors(project, nodeDescriptor, myOtherTypes.toArray());
    }
    else if (nodeDescriptorElement instanceof ConfigurationType) {
      ConfigurationFactory[] factories = ((ConfigurationType)nodeDescriptorElement).getConfigurationFactories();
      if (factories.length > 1) {
        return convertToDescriptors(project, nodeDescriptor, factories);
      }
    }
    return NodeDescriptor.getEmptyArray();
  }
@Override
  public NodeDescriptor<?>[] createChildElements(@NotNull Project project, @NotNull NodeDescriptor nodeDescriptor)