package org.objectstyle.wolips.eomodeler.actions; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.objectstyle.wolips.eomodeler.core.model.EOModelObject; import org.objectstyle.wolips.eomodeler.core.utils.EOModelUtils; public class CutOperation extends SimpleCompositeOperation { private List<EOModelObject> _clipboardObjects; private ISelection _previousSelection; private long _previousSelectionTime; public CutOperation(Object[] objects) { super(EOModelUtils.getOperationLabel("Cut", Arrays.asList(objects))); _clipboardObjects = new LinkedList<EOModelObject>(); for (Object obj : objects) { if (obj instanceof EOModelObject) { EOModelObject<?> eoModelObject = (EOModelObject) obj; CutItemOperation operation = new CutItemOperation(eoModelObject); add(operation); _clipboardObjects.add(eoModelObject._cloneModelObject()); } } } @Override public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { _previousSelection = LocalSelectionTransfer.getTransfer().getSelection(); _previousSelectionTime = LocalSelectionTransfer.getTransfer().getSelectionSetTime(); IStatus status; boolean succeeded = false; try { status = super.execute(monitor, info); if (status.getSeverity() == IStatus.OK) { succeeded = true; } } finally { if (succeeded) { LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(_clipboardObjects)); LocalSelectionTransfer.getTransfer().setSelectionSetTime(System.currentTimeMillis()); } } return status; } @Override public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { IStatus status; boolean succeeded = false; try { status = super.undo(monitor, info); if (status.getSeverity() == IStatus.OK) { succeeded = true; } } finally { if (succeeded) { LocalSelectionTransfer.getTransfer().setSelection(_previousSelection); LocalSelectionTransfer.getTransfer().setSelectionSetTime(_previousSelectionTime); } } return status; } @Override public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { _previousSelection = LocalSelectionTransfer.getTransfer().getSelection(); _previousSelectionTime = LocalSelectionTransfer.getTransfer().getSelectionSetTime(); IStatus status; boolean succeeded = false; try { status = super.redo(monitor, info); if (status.getSeverity() == IStatus.OK) { succeeded = true; } } finally { if (succeeded) { LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(_clipboardObjects)); LocalSelectionTransfer.getTransfer().setSelectionSetTime(System.currentTimeMillis()); } } return status; } }