/*  Copyright (C) 2003-2011 JabRef contributors.
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package net.sf.jabref.groups;

import javax.swing.undo.AbstractUndoableEdit;

import net.sf.jabref.Globals;

/**
 * @author jzieren
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class UndoableMoveGroup extends AbstractUndoableEdit {
    private final GroupSelector m_groupSelector;
    private final GroupTreeNode m_groupsRootHandle;
    private final int[] m_pathToNewParent;
    private final int m_newChildIndex;
    private final int[] m_pathToOldParent;
    private final int m_oldChildIndex;

    /**
     * @param moveNode
     *            The node which is being moved. At the time of construction of
     *            this object, it must not have moved yet.
     * @param newParent
     *            The new parent node to which <b>moveNode </b> will be moved.
     * @param newChildIndex
     *            The child index at <b>newParent </b> to which <b>moveNode </b>
     *            will be moved.
     */
    public UndoableMoveGroup(GroupSelector gs, GroupTreeNode groupsRoot,
            GroupTreeNode moveNode, GroupTreeNode newParent, int newChildIndex) {
        m_groupSelector = gs;
        m_groupsRootHandle = groupsRoot;
        m_pathToNewParent = newParent.getIndexedPath();
        m_newChildIndex = newChildIndex;
        m_pathToOldParent = ((GroupTreeNode) moveNode.getParent())
                .getIndexedPath();
        m_oldChildIndex = moveNode.getParent().getIndex(moveNode);
    }

    public String getUndoPresentationName() {
        return Globals.lang("Undo") + ": " 
            + Globals.lang("move group");
    }

    public String getRedoPresentationName() {
        return Globals.lang("Redo") + ": " 
            + Globals.lang("move group");
    }

    public void undo() {
        super.undo();
        GroupTreeNode cursor = m_groupsRootHandle
                .getDescendant(m_pathToNewParent);
        cursor = (GroupTreeNode) cursor.getChildAt(m_newChildIndex);
        m_groupsRootHandle.getDescendant(m_pathToOldParent).insert(cursor,
                m_oldChildIndex);
        m_groupSelector.revalidateGroups();
    }

    public void redo() {
        super.redo();
        GroupTreeNode cursor = m_groupsRootHandle
                .getDescendant(m_pathToOldParent);
        cursor = (GroupTreeNode) cursor.getChildAt(m_oldChildIndex);
        m_groupsRootHandle.getDescendant(m_pathToNewParent).insert(cursor,
                m_newChildIndex);
        m_groupSelector.revalidateGroups();
    }
}
