public List<MoveElementEvent> reconstruction() {
        Map<Integer, Point2D> oldPositions= buildOldPositions();

        for (ITreeStructure structure : newChangeStructure) {
            ElementInfo currentNodeInfo = manager.getElementInfo(structure.getId());

            ElementInfo parentInfo = manager.getElementInfo(structure.getIdParent());
            int parentDepth = parentInfo != null ? parentInfo.getDepth() : 0;
            int parentIndexAtRow = parentInfo != null ? parentInfo.getIndexAtRow() : 0;

            // change new depth and index at row
            currentNodeInfo.idParent = structure.getIdParent();
            currentNodeInfo.depth = structure.isRoot() ? 0 : parentDepth + 1;
            currentNodeInfo.indexAtRow = structure.isLeftChild() ?
                    BinaryTreeHelper.getLeftChildIndex(parentIndexAtRow) : BinaryTreeHelper.getRightChildIndex(parentIndexAtRow);

            //set new positions information
            DepthRowNode newNodePosition = getDepthRowNode(currentNodeInfo);
            newNodePosition.setElementId(structure.getId());
        }

        manager.layoutChange.disableGenerateEvent();
        manager.getLayoutChange().refresh();
        manager.layoutChange.enableGenerateEvent();
        List<MoveElementEvent> result = generateEvents(oldPositions);

        controlLastDepth();
        return result;
    }