- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Set;
- import org.eclipse.core.commands.ExecutionException;
- import org.eclipse.core.commands.operations.IOperationHistory;
- import org.eclipse.core.commands.operations.IOperationHistoryListener;
- import org.eclipse.core.commands.operations.IUndoableOperation;
- import org.eclipse.core.commands.operations.ObjectUndoContext;
- import org.eclipse.core.commands.operations.OperationHistoryEvent;
- import org.eclipse.emf.ecore.resource.Resource;
- import org.eclipse.emf.transaction.TransactionalEditingDomain;
- import org.eclipse.emf.workspace.IWorkspaceCommandStack;
- import org.eclipse.emf.workspace.ResourceUndoContext;
- import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
- import fr.tech.igpc.core.internal.Activator;
- import fr.tech.igpc.core.model.igpc.Root;
- import fr.tech.igpc.core.model.igpc.Sheet;
- import fr.tech.igpc.ui.rcp.view.FormPart;
- public class OperationContextManager implements IOperationHistoryListener {
- private static final HashMap<FormPart, ObjectUndoContext> views = new HashMap<FormPart, ObjectUndoContext>();
- private static final HashMap<FormPart, Boolean> status = new HashMap<FormPart, Boolean>();
- private static final HashMap<Root, FormPart> roots = new HashMap<Root, FormPart>();
- private static IOperationHistory operationHistory;
- private static IWorkspaceCommandStack wcs;
- private static final ArrayList<Listener> listeners = new ArrayList<Listener>();
- public OperationContextManager() {
- TransactionalEditingDomain ted = TransactionalEditingDomain.Registry.INSTANCE
- .getEditingDomain(fr.tech.igpc.core.internal.Activator.PLUGIN_ID);
- if (null == ted) {
- ted = WorkspaceEditingDomainFactory.INSTANCE.createEditingDomain();
- TransactionalEditingDomain.Registry.INSTANCE.add(
- fr.tech.igpc.core.internal.Activator.PLUGIN_ID, ted);
- }
- wcs = (IWorkspaceCommandStack) ted.getCommandStack();
- operationHistory = wcs.getOperationHistory();
- operationHistory.addOperationHistoryListener(this);
- }
- private static IOperationHistory getOperationHistory() {
- return operationHistory;
- }
- public static void register(FormPart view, Root root) {
- if (!views.containsKey(view)) {
- views.put(view, new ObjectUndoContext(view, view.getPartName()));
- roots.put(root, view);
- enable(view);
- }
- }
- public static void cleanViewStack(FormPart view) {
- getOperationHistory().dispose(views.get(view), true, true, false);
- }
- public static void disable(FormPart view) {
- status.put(view, false);
- }
- public static void enable(FormPart view) {
- status.put(view, true);
- }
- public static void unregister(FormPart view) {
- disable(view);
- ObjectUndoContext objectUndoContext = views.get(view);
- getOperationHistory().dispose(objectUndoContext, true, true, true);
- status.remove(view);
- views.remove(view);
- }
- public static void revert(FormPart view) {
- ObjectUndoContext objectUndoContext = views.get(view);
- while (getOperationHistory().canUndo(objectUndoContext))
- try {
- getOperationHistory().undo(objectUndoContext, null, null);
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- public static void aboutToSave(Root root) {
- for(Listener listener:listeners) {
- try {
- listener.aboutToSave(root);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void historyNotification(OperationHistoryEvent event) {
- Set<Resource> affectedResources = ResourceUndoContext
- .getAffectedResources(event.getOperation());
- if (event.getEventType() != OperationHistoryEvent.OPERATION_ADDED)
- return;
- Sheet s = Activator.getDefault().getModelProviderService().getModel()
- .getActiveSheet();
- Root concernedResource = null;
- for (Root root : roots.keySet()) {
- if (status.get(roots.get(root)) == false)
- continue;
- if ((affectedResources.contains(root.eResource()) && s == null)
- || (null != s && s.equals(root.getSheet().get(0)))) {
- concernedResource = root;
- break;
- }
- }
- if (null != concernedResource) {
- getOperationHistory().removeOperationHistoryListener(this);
- IUndoableOperation operation = event.getOperation();
- // remove default undo context
- operation.removeContext(wcs.getDefaultUndoContext());
- // Add is own undo context
- operation.addContext(views.get(roots.get(concernedResource)));
- getOperationHistory().addOperationHistoryListener(this);
- roots.get(concernedResource).setUnsaved();
- Activator.getDefault().getModelProviderService().getModel()
- .setActiveSheet(null);
- }
- }
- public static void addListener(Listener listener) {
- assert(listener != null);
- listeners.add(listener);
- }
- public static void removeListener(Listener listener) {
- assert(listener != null);
- listeners.remove(listener);
- }
- public interface Listener {
- public void aboutToSave(Root s);
- }
- }