private void initChildren() {
    BinTreeTableNode root = (BinTreeTableNode) getRoot();

    BinClass clazz = (BinClass) root.getBin();

    BinMethod[] overriddables = OverrideMethodsRefactoring.getOverridableMethods(clazz);

    // group by subclass
    MultiValueMap map = new MultiValueMap();

    for (int i = 0; i < overriddables.length; i++) {
      map.putAll(overriddables[i].getOwner(), overriddables[i]);
    }

    isEmpty = (overriddables.length == 0);

    List keys = new ArrayList(map.keySet());

    Collections.sort(keys, new TypeRefHierarchyComparator());

    for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
      BinTypeRef item = (BinTypeRef) iter.next();

      //      if (Assert.enabled) {
      //        Assert.must(!item.equals(targetClass.getOwner()),
      //            "overridable should be only superclass methods!");
      //      }
      BinTreeTableNode node = new BinTreeTableNode(item);

      root.addChild(node);

      addMethodNodes(node, map.get(item));
    }
  }
  private void addMethodNodes(BinTreeTableNode parentNode, List collection) {
    Collections.sort(
        collection,
        new Comparator() {
          public int compare(Object obj1, Object obj2) {
            return ((BinMethod) obj1).getName().compareTo(((BinMethod) obj2).getName());
          }
        });

    for (Iterator iter = collection.iterator(); iter.hasNext(); ) {
      BinMethod item = (BinMethod) iter.next();

      BinTreeTableNode child = new BinTreeTableNode(item);

      parentNode.addChild(child);

      child.setSelected(item.isAbstract());
    }
  }