blob: 26313dd675d12d10a70da455ff6d333cf81e51d1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BestSolution.at and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
******************************************************************************/
package org.eclipse.e4.tools.emf.editor3x;
import java.util.Collection;
import org.eclipse.e4.tools.emf.ui.common.IModelResource;
import org.eclipse.e4.ui.model.application.ui.MUILabel;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.DeleteCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.jface.action.Action;
public class UndoAction extends Action {
private final IModelResource resource;
private final IModelResource.ModelListener listener;
public UndoAction(IModelResource resource) {
this.resource = resource;
listener = new IModelResource.ModelListener() {
@Override
public void commandStackChanged() {
update();
}
@Override
public void dirtyChanged() {
}
};
resource.addModelListener(listener);
update();
}
@Override
public void run() {
if (resource.getEditingDomain().getCommandStack().canUndo()) {
resource.getEditingDomain().getCommandStack().undo();
}
}
private static int cpt = 0;
private void update() {
if (resource.getEditingDomain().getCommandStack().canUndo()) {
Command undoCommand = resource.getEditingDomain().getCommandStack()
.getUndoCommand();
String label = getCommandLabel(undoCommand);
setText(Messages.UndoAction_Undo + " " //$NON-NLS-1$
+ label);
setEnabled(true);
} else {
setText(Messages.UndoAction_Undo);
setEnabled(false);
}
}
/**
* Compute a command label depending on the command for undo/redo label.
*
* For instance : Add Trimmedwindow or Delete 5 objects
*
* @param cmd
* @return a description string for the command
*/
public static String getCommandLabel(Command cmd) {
if (cmd instanceof SetCommand) {
SetCommand sc = (SetCommand) cmd;
return sc.getLabel() + " " + sc.getFeature().getName() + " on " + sc.getOwner().eClass().getName(); //$NON-NLS-1$ //$NON-NLS-2$
} else if (cmd instanceof AddCommand) {
AddCommand ac = (AddCommand) cmd;
return ac.getLabel() + " " + getFirstClassName(ac.getCollection()); //$NON-NLS-1$
} else if (cmd instanceof DeleteCommand) {
DeleteCommand dc = (DeleteCommand) cmd;
Collection<?> deleted = dc.getCollection();
if (deleted.size() == 1) {
return dc.getLabel() + " " + getFirstClassName(deleted); //$NON-NLS-1$
}
return dc.getLabel() + " " + dc.getCollection().size() + " Objects"; //$NON-NLS-1$ //$NON-NLS-2$
}
return cmd.getLabel();
}
/**
* Get the eClassname or empty string of the first element in the collection
*
* @param c
* @return name of classname if object is an EObject else an empty string
*/
private static String getFirstClassName(Collection<?> c)
{
Object o = c.iterator().next();
String clname = (o instanceof EObject) ? ((EObject) o).eClass().getName() : ""; //$NON-NLS-1$
String dname = (o instanceof MUILabel) ? ((MUILabel) o).getLabel() : ""; //$NON-NLS-1$
return clname + " " + (dname == null ? "" : dname); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Clean up
*/
public void dispose() {
resource.removeModelListener(listener);
}
}