/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.common.model.undo;

import java.text.MessageFormat;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.impl.*;

public class XMoveUndo extends XUndoableImpl {
    protected XModel model = null;
    protected String path = null;
    protected int from, to;
    protected String op;

    public XMoveUndo(XModelObject object, int from, int to) {
        model = object.getModel();
        path = object.getPath();
        this.from = from;
        this.to = to;
        op = object.getAttributeValue(XModelObjectConstants.ATTR_ELEMENT_TYPE) + " " + //$NON-NLS-1$
             object.getModelEntity().getRenderer().getTitle(object);
        resetDescription();
    }

    private void resetDescription() {
        description = MessageFormat.format("{0}-th child of {1} moved to {2}-th position",
				(from + 1), op, (to + 1));
    }

    public void doUndo() {
        execute(to, from);
    }

    public void doRedo() {
        execute(from, to);
    }

    protected void execute(int f, int t) {
        XModelObject object = model.getByPath(path);
        if(object == null || (!(object instanceof OrderedObjectImpl))) return;
        OrderedObjectImpl oo = (OrderedObjectImpl)object;
        oo.move(f, t, true);
        oo.setModified(true);
    }

    protected String getActionIcon() {
        return "images/actions/undo.gif"; //$NON-NLS-1$
    }

    protected boolean merge(XUndoableImpl u) {
        if(!(u instanceof XMoveUndo)) return false;
        XMoveUndo c = (XMoveUndo)u;
        if(path.equals(c.path) && to == c.from) {
            to = c.to;
            resetDescription();
            return true;
        }
        return false;
    }

}
