Copyright (c) 2005, 2015 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2005, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.commands.operations;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
Abstract implementation for an undoable operation. At a minimum, subclasses should implement behavior for IUndoableOperation.execute(IProgressMonitor, IAdaptable)
, IUndoableOperation.redo(IProgressMonitor, IAdaptable)
, and IUndoableOperation.undo(IProgressMonitor, IAdaptable)
.
See Also: Since: 3.1
/**
* <p>
* Abstract implementation for an undoable operation. At a minimum, subclasses
* should implement behavior for
* {@link IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)},
* {@link IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)},
* and
* {@link IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)}.
* </p>
*
* @see org.eclipse.core.commands.operations.IUndoableOperation
*
* @since 3.1
*/
public abstract class AbstractOperation implements IUndoableOperation {
List<IUndoContext> contexts = new ArrayList<>();
private String label = ""; //$NON-NLS-1$
Construct an operation that has the specified label.
Params: - label –
the label to be used for the operation. Should never be
null
.
/**
* Construct an operation that has the specified label.
*
* @param label
* the label to be used for the operation. Should never be
* <code>null</code>.
*/
public AbstractOperation(String label) {
Assert.isNotNull(label);
this.label = label;
}
@Override
public void addContext(IUndoContext context) {
if (!contexts.contains(context)) {
contexts.add(context);
}
}
@Override
public boolean canExecute() {
return true;
}
@Override
public boolean canRedo() {
return true;
}
@Override
public boolean canUndo() {
return true;
}
@Override
public void dispose() {
// nothing to dispose.
}
@Override
public abstract IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
@Override
public final IUndoContext[] getContexts() {
return contexts.toArray(new IUndoContext[contexts.size()]);
}
@Override
public String getLabel() {
return label;
}
Set the label of the operation to the specified name.
Params: - name –
the string to be used for the label. Should never be
null
.
/**
* Set the label of the operation to the specified name.
*
* @param name
* the string to be used for the label. Should never be
* <code>null</code>.
*/
public void setLabel(String name) {
label = name;
}
@Override
public final boolean hasContext(IUndoContext context) {
Assert.isNotNull(context);
for (int i = 0; i < contexts.size(); i++) {
IUndoContext otherContext = contexts.get(i);
// have to check both ways because one context may be more general
// in
// its matching rules than another.
if (context.matches(otherContext) || otherContext.matches(context)) {
return true;
}
}
return false;
}
@Override
public abstract IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
@Override
public void removeContext(IUndoContext context) {
contexts.remove(context);
}
@Override
public abstract IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
The string representation of this operation. Used for debugging purposes
only. This string should not be shown to an end user.
Returns: The string representation.
/**
* The string representation of this operation. Used for debugging purposes
* only. This string should not be shown to an end user.
*
* @return The string representation.
*/
@Override
public String toString() {
final StringBuilder stringBuffer = new StringBuilder();
stringBuffer.append(getLabel());
stringBuffer.append("("); //$NON-NLS-1$
IUndoContext[] contexts = getContexts();
for (int i = 0; i < contexts.length; i++) {
stringBuffer.append(contexts[i].toString());
if (i != contexts.length - 1) {
stringBuffer.append(',');
}
}
stringBuffer.append(')');
return stringBuffer.toString();
}
}