Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 13th, 2012  |  syntax: None  |  size: 4.88 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.Set;
  4.  
  5. import org.eclipse.core.commands.ExecutionException;
  6. import org.eclipse.core.commands.operations.IOperationHistory;
  7. import org.eclipse.core.commands.operations.IOperationHistoryListener;
  8. import org.eclipse.core.commands.operations.IUndoableOperation;
  9. import org.eclipse.core.commands.operations.ObjectUndoContext;
  10. import org.eclipse.core.commands.operations.OperationHistoryEvent;
  11. import org.eclipse.emf.ecore.resource.Resource;
  12. import org.eclipse.emf.transaction.TransactionalEditingDomain;
  13. import org.eclipse.emf.workspace.IWorkspaceCommandStack;
  14. import org.eclipse.emf.workspace.ResourceUndoContext;
  15. import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
  16.  
  17. import fr.tech.igpc.core.internal.Activator;
  18. import fr.tech.igpc.core.model.igpc.Root;
  19. import fr.tech.igpc.core.model.igpc.Sheet;
  20. import fr.tech.igpc.ui.rcp.view.FormPart;
  21.  
  22. public class OperationContextManager implements IOperationHistoryListener {
  23.  
  24.         private static final HashMap<FormPart, ObjectUndoContext> views = new HashMap<FormPart, ObjectUndoContext>();
  25.         private static final HashMap<FormPart, Boolean> status = new HashMap<FormPart, Boolean>();
  26.         private static final HashMap<Root, FormPart> roots = new HashMap<Root, FormPart>();
  27.  
  28.         private static IOperationHistory operationHistory;
  29.         private static IWorkspaceCommandStack wcs;
  30.         private static final ArrayList<Listener> listeners = new ArrayList<Listener>();
  31.  
  32.         public OperationContextManager() {
  33.                 TransactionalEditingDomain ted = TransactionalEditingDomain.Registry.INSTANCE
  34.                                 .getEditingDomain(fr.tech.igpc.core.internal.Activator.PLUGIN_ID);
  35.                 if (null == ted) {
  36.                         ted = WorkspaceEditingDomainFactory.INSTANCE.createEditingDomain();
  37.                         TransactionalEditingDomain.Registry.INSTANCE.add(
  38.                                         fr.tech.igpc.core.internal.Activator.PLUGIN_ID, ted);
  39.                 }
  40.                 wcs = (IWorkspaceCommandStack) ted.getCommandStack();
  41.                 operationHistory = wcs.getOperationHistory();
  42.                 operationHistory.addOperationHistoryListener(this);
  43.         }
  44.  
  45.         private static IOperationHistory getOperationHistory() {
  46.                 return operationHistory;
  47.         }
  48.  
  49.         public static void register(FormPart view, Root root) {
  50.                 if (!views.containsKey(view)) {
  51.                         views.put(view, new ObjectUndoContext(view, view.getPartName()));
  52.                         roots.put(root, view);
  53.                         enable(view);
  54.                 }
  55.         }
  56.  
  57.         public static void cleanViewStack(FormPart view) {
  58.                 getOperationHistory().dispose(views.get(view), true, true, false);
  59.         }
  60.  
  61.         public static void disable(FormPart view) {
  62.                 status.put(view, false);
  63.         }
  64.  
  65.         public static void enable(FormPart view) {
  66.                 status.put(view, true);
  67.         }
  68.  
  69.         public static void unregister(FormPart view) {
  70.                 disable(view);
  71.                 ObjectUndoContext objectUndoContext = views.get(view);
  72.                 getOperationHistory().dispose(objectUndoContext, true, true, true);
  73.                 status.remove(view);
  74.                 views.remove(view);
  75.         }
  76.  
  77.         public static void revert(FormPart view) {
  78.                 ObjectUndoContext objectUndoContext = views.get(view);
  79.                 while (getOperationHistory().canUndo(objectUndoContext))
  80.                         try {
  81.                                 getOperationHistory().undo(objectUndoContext, null, null);
  82.                         } catch (ExecutionException e) {
  83.                                 e.printStackTrace();
  84.                         }
  85.         }
  86.        
  87.         public static void aboutToSave(Root root) {
  88.                 for(Listener listener:listeners) {
  89.                         try {
  90.                                 listener.aboutToSave(root);
  91.                         } catch (Exception e) {
  92.                                 e.printStackTrace();
  93.                         }
  94.                 }
  95.         }
  96.  
  97.         @Override
  98.         public void historyNotification(OperationHistoryEvent event) {
  99.                 Set<Resource> affectedResources = ResourceUndoContext
  100.                                 .getAffectedResources(event.getOperation());
  101.  
  102.                 if (event.getEventType() != OperationHistoryEvent.OPERATION_ADDED)
  103.                         return;
  104.  
  105.                 Sheet s = Activator.getDefault().getModelProviderService().getModel()
  106.                                 .getActiveSheet();
  107.  
  108.                 Root concernedResource = null;
  109.                 for (Root root : roots.keySet()) {
  110.                         if (status.get(roots.get(root)) == false)
  111.                                 continue;
  112.                         if ((affectedResources.contains(root.eResource()) && s == null)
  113.                                         || (null != s && s.equals(root.getSheet().get(0)))) {
  114.                                 concernedResource = root;
  115.                                 break;
  116.                         }
  117.                 }
  118.  
  119.                 if (null != concernedResource) {
  120.                         getOperationHistory().removeOperationHistoryListener(this);
  121.  
  122.                         IUndoableOperation operation = event.getOperation();
  123.  
  124.                         // remove default undo context
  125.                         operation.removeContext(wcs.getDefaultUndoContext());
  126.  
  127.                         // Add is own undo context
  128.                         operation.addContext(views.get(roots.get(concernedResource)));
  129.  
  130.                         getOperationHistory().addOperationHistoryListener(this);
  131.                         roots.get(concernedResource).setUnsaved();
  132.  
  133.                         Activator.getDefault().getModelProviderService().getModel()
  134.                                         .setActiveSheet(null);
  135.                 }
  136.         }
  137.        
  138.         public static void addListener(Listener listener) {
  139.                 assert(listener != null);
  140.                 listeners.add(listener);
  141.         }
  142.        
  143.         public static void removeListener(Listener listener) {
  144.                 assert(listener != null);
  145.                 listeners.remove(listener);
  146.         }
  147.        
  148.         public interface Listener {
  149.                 public void aboutToSave(Root s);
  150.         }
  151. }