/*******************************************************************************
 * 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 org.eclipse.swt.graphics.Image;
import org.jboss.tools.common.model.util.IconUtil;

public abstract class XUndoableImpl implements XUndoable {
    public static final int EDIT = 0;
    public static final int ADD = 1;
    public static final int REMOVE = 2;
    protected int kind;
    protected XUndoableImpl next = null;
    protected XUndoableImpl prev = null;
    protected boolean undone = false;

    protected String description = ""; //$NON-NLS-1$
    protected Image icon = null;

    public XUndoableImpl() {}

    public void setNext(XUndoableImpl next) {
        this.next = next;
        if(next != null) next.prev = this;
    }

    public XUndoableImpl prev() {
        return prev;
    }

    public XUndoableImpl next() {
        return next;
    }

    public void undo() {
        doUndo();
        undone = true;
    }

    public void redo() {
        doRedo();
        undone = false;
    }

    public boolean canUndo() {
        return !undone;
    }

    public boolean canRedo() {
        return undone;
    }

    protected abstract void doUndo();
    protected abstract void doRedo();

    public String getDescription() {
        return description;
    }

    public Image[] icons() {
        return new Image[] {IconUtil.getEclipseImage(getActionIcon()), icon};
    }

    protected String getActionIcon() {
        return (kind == ADD) ? "images/java/newattribute.gif" : //$NON-NLS-1$
               (kind == REMOVE) ? "images/actions/delete.gif" : //$NON-NLS-1$
                                  "images/file/redhat_file.gif"; //$NON-NLS-1$
    }

    protected boolean merge(XUndoableImpl u) {
        return false;
    }

}

