/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.formbuilder.client.options; import java.util.LinkedList; import java.util.List; import org.jbpm.formapi.client.CommonGlobals; import org.jbpm.formbuilder.client.bus.UndoRedoEvent; import org.jbpm.formbuilder.client.bus.UndoableEvent; import org.jbpm.formbuilder.client.bus.UndoableHandler; import com.google.gwt.event.shared.EventBus; /** * Handles undo / redo actions */ public class UndoRedoManager { /* static methods */ private static final UndoRedoManager INSTANCE = new UndoRedoManager(); private final EventBus bus = CommonGlobals.getInstance().getEventBus(); public static UndoRedoManager getInstance() { return INSTANCE; } /* instance methods */ private List<UndoableEvent> undoRedoWindow = new LinkedList<UndoableEvent>(); private int index = -1; /** * Registers itself to listen every {@link UndoableEvent} */ private UndoRedoManager() { bus.addHandler(UndoableEvent.TYPE, new UndoableHandler() { @Override public void onEvent(UndoableEvent event) { syncAdd(event); } @Override public void undoAction(UndoableEvent event) { } @Override public void doAction(UndoableEvent event) { } }); } protected synchronized void syncAdd(UndoableEvent event) { this.index++; while (this.index < this.undoRedoWindow.size()) { //delete all posterior actions when a new action happens this.undoRedoWindow.remove(this.index); } this.undoRedoWindow.add(event); } /** * gets the previous action in the history and reverts it */ public synchronized void undo() { if (canUndo()) { UndoableEvent event = undoRedoWindow.get(index); index--; event.getRollbackHandler().undoAction(event); bus.fireEvent(new UndoRedoEvent()); } } /** * gets the next action in the history and redoes it */ public synchronized void redo() { if (canRedo()) { index++; UndoableEvent event = undoRedoWindow.get(index); event.getRollbackHandler().doAction(event); bus.fireEvent(new UndoRedoEvent()); } } public boolean canUndo() { return undoRedoWindow.size() > 0 && index >= 0; } public boolean canRedo() { return undoRedoWindow.size() > 0 && index < (undoRedoWindow.size() - 1); } }