void () { if (myIsDisposed || myCurrentParent == null) { return; } if (myTreeStructure.hasSomethingToCommit()) { myTreeStructure.commit(); } AbstractTreeNode<?> parentDescriptor = myCurrentParent; while (true) { parentDescriptor.update(); if (parentDescriptor.getValue() != null) break; parentDescriptor = parentDescriptor.getParent(); } Object[] children = getChildren(parentDescriptor); HashMap<Object, Integer> elementToIndexMap = new HashMap<>(); for (int i = 0; i < children.length; i++) { elementToIndexMap.put(children[i], Integer.valueOf(i)); } List<NodeDescriptor<?>> resultDescriptors = new ArrayList<>(); Object[] listChildren = myModel.toArray(); for (final Object child : listChildren) { if (!(child instanceof NodeDescriptor descriptor)) { continue; } descriptor.update(); final Object newElement = descriptor.getElement(); final Integer index = newElement != null ? elementToIndexMap.get(newElement) : null; if (index != null) { resultDescriptors.add(descriptor); descriptor.setIndex(index.intValue()); elementToIndexMap.remove(newElement); } } for (final Object child : elementToIndexMap.keySet()) { final Integer index = elementToIndexMap.get(child); if (index != null) { final NodeDescriptor childDescr = myTreeStructure.createDescriptor(child, parentDescriptor); childDescr.setIndex(index.intValue()); childDescr.update(); resultDescriptors.add(childDescr); } } SelectionInfo selection = storeSelection(); if (myComparator != null) { resultDescriptors.sort(myComparator); } else { resultDescriptors.sort(IndexComparator.INSTANCE); } if (shouldAddTopElement()) { final List<NodeDescriptor<?>> elems = new ArrayList<>(); Object value = parentDescriptor.getValue(); if (value != null) { elems.add(new TopLevelNode(myProject, value)); } elems.addAll(resultDescriptors); myModel.replaceElements(elems); } else { myModel.replaceElements(resultDescriptors); } restoreSelection(selection); updateParentTitle(); }