package org.jabref.gui.groups;
import java.util.List;
import java.util.Vector;
import org.jabref.gui.undo.AbstractUndoableJabRefEdit;
import org.jabref.model.groups.GroupTreeNode;
public class UndoableModifySubtree extends AbstractUndoableJabRefEdit {
/** A backup of the groups before the modification */
private final GroupTreeNode m_groupRoot;
private final GroupTreeNode m_subtreeBackup;
/** The path to the global groups root node */
private final List<Integer> m_subtreeRootPath;
/** This holds the new subtree (the root's modified children) to allow redo. */
private final List<GroupTreeNode> m_modifiedSubtree = new Vector<>();
private final String m_name;
/**
*
* @param subtree
* The root node of the subtree that was modified (this node may
* not be modified, it is just used as a convenience handle).
*/
public UndoableModifySubtree(GroupTreeNodeViewModel groupRoot,
GroupTreeNodeViewModel subtree, String name) {
m_subtreeBackup = subtree.getNode().copySubtree();
m_groupRoot = groupRoot.getNode();
m_subtreeRootPath = subtree.getNode().getIndexedPathFromRoot();
m_name = name;
}
@Override
public String getPresentationName() {
return m_name;
}
@Override
public void undo() {
super.undo();
// remember modified children for redo
m_modifiedSubtree.clear();
// get node to edit
final GroupTreeNode subtreeRoot = m_groupRoot.getDescendant(m_subtreeRootPath).get(); //TODO: NULL
for (GroupTreeNode child : subtreeRoot.getChildren()) {
m_modifiedSubtree.add(child);
}
// keep subtree handle, but restore everything else from backup
subtreeRoot.removeAllChildren();
for (GroupTreeNode child : m_subtreeBackup.getChildren()) {
child.copySubtree().moveTo(subtreeRoot);
}
}
@Override
public void redo() {
super.redo();
final GroupTreeNode subtreeRoot = m_groupRoot.getDescendant(m_subtreeRootPath).get(); //TODO: NULL
subtreeRoot.removeAllChildren();
for (GroupTreeNode modifiedNode : m_modifiedSubtree) {
modifiedNode.moveTo(subtreeRoot);
}
}
}