blob: 608260dd7728a3ed4688dd68c09deeb6eef1275c [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2014, 2019 SAP SE
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* mwenz - Bug 443304 - Improve undo/redo handling in Graphiti features
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.pattern;
import org.eclipse.graphiti.features.IFeature;
import org.eclipse.graphiti.features.context.IContext;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
/**
* This interface can by used and implemented by customers within any pattern to
* signal the need for additional work that needs to be done before or after
* undo and redo. When a pattern implements this interface, and the framework
* performs an undo or a redo, the framework will call the contained methods.
* <p>
* Implementing this interface is especially helpful if customers want to
* implement undo/redo functionality for non-EMF changes, e.g. for non-EMF
* domain models. Note that any EMF-model change (including the changes done to
* the graphical representation (Graphiti {@link PictogramElement}s and
* {@link GraphicsAlgorithm}s will by handled automatically by the Graphiti
* framework no matter if this interface is implemented by a pattern or not. The
* pattern may use the context and feature objects (e.g. the contained
* properties set) passed to the contained methods while executing the pattern
* in order to collect any information needed for undo.
* <p>
* In case you want to cancel undo/redo operations in {@link #preUndo(IContext)}/{@link #preRedo(IContext)}, you need to implement
* {@link ICustomAbortableUndoRedoPattern} which offers an
* {@link ICustomAbortableUndoRedoPattern#isAbort()} method that causes the
* cancellation of undo/redo operation in case <code>true</code> is returned.
*
* @see ICustomAbortableUndoRedoPattern
* @since 0.12
*/
public interface ICustomUndoRedoPattern {
/**
* Decides if the changes done by a processed pattern functionality can be
* undone. This method is called once by the Graphiti framework just before
* any undo work is started, e.g. before {@link #preUndo(IContext)}.
* <p>
* Note that as soon as any pattern reports <code>false</code> here, also
* all previous entries in the command stack are no longer reachable for
* undo.
*
* @param feature
* this is the instance of the {@link IFeature} object that was
* in use when executing the pattern functionality
* @param context
* this is the instance of the {@link IContext} object that was
* in use when executing the feature.
*
* @return true if the feature can be undone, false if not
*/
boolean canUndo(IFeature feature, IContext context);
/**
* This method will be called by the Graphiti framework before the EMF undo
* is triggered. Customers may revert their non-EMF changes done by the
* pattern functionality here or in {@link #postUndo(IContext)}.
*
* @param feature
* this is the instance of the {@link IFeature} object that was
* in use when executing the pattern functionality
* @param context
* this is the instance of the {@link IContext} object that was
* in use when executing the feature
*/
void preUndo(IFeature feature, IContext context);
/**
* This method will be called by the Graphiti framework after the EMF undo
* is finished. Customers may revert their non-EMF changes done by the
* pattern functionality here or in {@link #preUndo(IContext)}.
*
* @param feature
* this is the instance of the {@link IFeature} object that was
* in use when executing the pattern functionality
* @param context
* this is the instance of the {@link IContext} object that was
* in use when executing the feature
*/
void postUndo(IFeature feature, IContext context);
/**
* Decides if the processed feature can be re-done. This method is called
* once by the Graphiti framework just before any redo work is started, e.g.
* before {@link #preRedo(IContext)}.
* <p>
* Note that as soon as any pattern reports <code>false</code> here, also
* all consecutive entries in the command stack are no longer reachable for
* redo.
*
* @param feature
* this is the instance of the {@link IFeature} object that was
* in use when executing the pattern functionality
* @param context
* this is the instance of the {@link IContext} object that was
* in use when executing the feature
*
* @return true if the feature can be re-done, false if not
*/
boolean canRedo(IFeature feature, IContext context);
/**
* This method will be called by the Graphiti framework before the EMF undo
* has triggered. Customers may re-apply their non-EMF changes done by the
* pattern functionality here or in {@link #postRedo(IContext)}. (Usually it
* might be sufficient to delegate to the execution method of the feature.)
*
* @param feature
* this is the instance of the {@link IFeature} object that was
* in use when executing the pattern functionality
* @param context
* this is the instance of the {@link IContext} object that was
* in use when executing the feature
*/
void preRedo(IFeature feature, IContext context);
/**
* This method will be called by the Graphiti framework after the EMF undo
* has finished. Customers may re-apply their non-EMF changes done by the
* pattern functionality here or in {@link #preRedo(IContext)}. (Usually it
* might be sufficient to delegate to the execution method of the feature.)
*
* @param feature
* this is the instance of the {@link IFeature} object that was
* in use when executing the pattern functionality
* @param context
* this is the instance of the {@link IContext} object that was
* in use when executing the feature
*/
void postRedo(IFeature feature, IContext context);
}