/**
   * Returns all the widgets which support a given type.
   *
   * @param type the type to support
   * @return the widgets which support the given type
   */
  public static Set<Class<? extends Widget>> getWidgetsForType(DataType type) {
    Set<DataType> types = generateTypes(new LinkedHashSet<DataType>(), type.getParents());
    types.add(type);

    Set<Class<? extends Widget>> elements = new LinkedHashSet<Class<? extends Widget>>();

    for (DataType t : types) {
      Set<Class<? extends Widget>> set = map.get(t);
      if (set != null) {
        Class<? extends Widget> priority = t.getDefault();
        if (priority != null) {
          elements.add(priority);
        }
      }
    }
    for (DataType t : types) {
      Set<Class<? extends Widget>> set = map.get(t);
      if (set != null) {
        elements.addAll(set);
      }
    }

    return elements;
  }