diff options
author | Juergen Haug | 2015-04-23 09:51:11 +0000 |
---|---|---|
committer | Juergen Haug | 2015-04-23 09:52:07 +0000 |
commit | b7fa7ba01ea372770adb58bea7d406557aac4ff9 (patch) | |
tree | 7d1d8f85c72a19afcfd8c7f5b88744d31c4021aa | |
parent | 010c1cb56cfc69d47da1b49ea0dcc5e9794f674e (diff) | |
download | org.eclipse.etrice-b7fa7ba01ea372770adb58bea7d406557aac4ff9.tar.gz org.eclipse.etrice-b7fa7ba01ea372770adb58bea7d406557aac4ff9.tar.xz org.eclipse.etrice-b7fa7ba01ea372770adb58bea7d406557aac4ff9.zip |
[ui] reverted modification tracker
-rw-r--r-- | plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/ConcurrentModificationObserver.java | 95 | ||||
-rw-r--r-- | plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java (renamed from plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/DirtyResourceTracker.java) | 323 | ||||
-rw-r--r-- | plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java | 3 |
3 files changed, 222 insertions, 199 deletions
diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/ConcurrentModificationObserver.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/ConcurrentModificationObserver.java new file mode 100644 index 000000000..bd4f0ad1c --- /dev/null +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/ConcurrentModificationObserver.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2010 protos software gmbh (http://www.protos.de). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * CONTRIBUTORS: + * Jan Koehnlein (Itemis, initially from org.eclipse.xtext.gmf.glue) + * + *******************************************************************************/ + +package org.eclipse.etrice.ui.common.base.concurrency; + +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.emf.edit.domain.IEditingDomainProvider; +import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorReference; +import org.eclipse.ui.IPartListener; +import org.eclipse.ui.IStartup; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PlatformUI; + +/** + * Detects concurrent modifications of Graphiti (eTrice structure and behavior) + * and Xtext editors based on Xtext's dirty state management. + * + * @author Jan Koehnlein + * @author Henrik Rentz-Reichert + * + */ +public class ConcurrentModificationObserver implements IPartListener { + + private EditingDomainAdapter.Factory factory; + + public ConcurrentModificationObserver(IWorkbenchPage activePage) { + factory = new EditingDomainAdapter.Factory(); + for (IEditorReference editorRef : activePage.getEditorReferences()) { + IEditorPart editor = editorRef.getEditor(false); + if (editor != null) { + partOpened(editor); + } + } + } + + public void partOpened(IWorkbenchPart part) { + Object adapter = part.getAdapter(IEditingDomainProvider.class); + if (adapter instanceof IEditingDomainProvider) { + EditingDomain editingDomain = ((IEditingDomainProvider) adapter).getEditingDomain(); + if (editingDomain instanceof TransactionalEditingDomain) + factory.adapt(editingDomain, EditingDomainAdapter.class); + } + } + + public void partClosed(IWorkbenchPart part) { + Object adapter = part.getAdapter(IEditingDomainProvider.class); + if (adapter instanceof IEditingDomainProvider) { + EditingDomain editingDomain = ((IEditingDomainProvider) adapter).getEditingDomain(); + if (editingDomain instanceof TransactionalEditingDomain) { + EditingDomainAdapter editingDomainAdapter = (EditingDomainAdapter) factory.adapt(editingDomain, + EditingDomainAdapter.class); + if (editingDomainAdapter != null) { + editingDomainAdapter.dispose(); + } + } + } + } + + public void partActivated(IWorkbenchPart part) { + // do nothing + } + + public void partDeactivated(IWorkbenchPart part) { + // do nothing + } + + public void partBroughtToTop(IWorkbenchPart part) { + // do nothing + } + + public static class Initializer implements IStartup { + public void earlyStartup() { + Display.getDefault().asyncExec(new Runnable() { + public void run() { + IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + activePage.addPartListener(new ConcurrentModificationObserver(activePage)); + } + }); + } + } + +} diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/DirtyResourceTracker.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java index 0710862e1..f27099d0b 100644 --- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/DirtyResourceTracker.java +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 protos software gmbh (http://www.protos.de). + * Copyright (c) 2010 protos software gmbh (http://www.protos.de). * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,8 +7,6 @@ * * CONTRIBUTORS: * Jan Koehnlein (Itemis, initially from org.eclipse.xtext.gmf.glue) - * Henrik Rentz-Reichert - * Juergen Haug (initial contribution) * *******************************************************************************/ @@ -21,8 +19,13 @@ import java.util.Map; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.command.Command; +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.Notifier; +import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl; +import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.transaction.NotificationFilter; import org.eclipse.emf.transaction.ResourceSetChangeEvent; import org.eclipse.emf.transaction.ResourceSetListener; @@ -33,14 +36,10 @@ import org.eclipse.emf.transaction.TransactionalEditingDomainEvent; import org.eclipse.emf.transaction.TransactionalEditingDomainListener; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.etrice.ui.common.base.UIBaseActivator; -import org.eclipse.etrice.ui.common.base.editor.DiagramEditorBase; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IPartListener; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.PlatformUI; import org.eclipse.xtext.resource.IResourceServiceProvider; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.IDirtyResource; @@ -49,160 +48,92 @@ import org.eclipse.xtext.ui.shared.Access; import com.google.common.collect.Lists; -/** - * Detects concurrent modifications of eTrice structure and behavior - * and Xtext editors based on Xtext's dirty state management. - * <p> - * Based on former ConcurrentModificationObserver and EditingDomainAdapter - */ -public class DirtyResourceTracker { - - public static void register(DiagramEditorBase diagramEditor){ - new DirtyResourceTracker(diagramEditor); - } - - protected class DialogPrompter implements Runnable { - - private boolean isYesResult; - - public boolean isYesResult() { - return isYesResult; - } - - public void run() { - Shell shell = Display.getDefault().getActiveShell(); - isYesResult = MessageDialog.open(MessageDialog.QUESTION, shell, "Concurrent Modification", - "Other editors have a modified version of models you are going to change.\n" - + "If you apply your changes you are loosing the possibility to save the others.\n" - + "Apply changes anyway?", SWT.NONE); - } - } - - protected class ResourceSetListenerImpl implements ResourceSetListener { +public class EditingDomainAdapter extends AdapterImpl implements ResourceSetListener, + TransactionalEditingDomainListener { + public static class Factory extends AdapterFactoryImpl { @Override - public NotificationFilter getFilter() { - return null; + public boolean isFactoryForType(Object type) { + return super.isFactoryForType(type == EditingDomainAdapter.class); } @Override - public Command transactionAboutToCommit(ResourceSetChangeEvent event) throws RollbackException { - checkConcurrentModificationOnTransaction(); - - return null; - } - - @Override - public void resourceSetChanged(ResourceSetChangeEvent event) { - } - - @Override - public boolean isAggregatePrecommitListener() { - return false; - } - - @Override - public boolean isPrecommitOnly() { - return false; + protected Object resolve(Object object, Object type) { + if (object instanceof TransactionalEditingDomain) { + return adapt(((TransactionalEditingDomain) object).getResourceSet(), type); + } + return super.resolve(object, type); } @Override - public boolean isPostcommitOnly() { - return false; + protected Adapter createAdapter(Notifier target) { + if (target instanceof ResourceSet) { + return new EditingDomainAdapter(TransactionUtil.getEditingDomain(target)); + } else { + return null; + } } - } - protected class PartListenerImpl implements IPartListener { - - @Override - public void partActivated(IWorkbenchPart part) { - - } - - @Override - public void partBroughtToTop(IWorkbenchPart part) { - - } - - @Override - public void partClosed(IWorkbenchPart part) { - dispose(); - } - - @Override - public void partDeactivated(IWorkbenchPart part) { - updateDirtyStateOnEditorDeactivation(); - } + private final TransactionalEditingDomain editingDomain; - @Override - public void partOpened(IWorkbenchPart part) { + private IDirtyStateManager dirtyStateManager; - } + private Map<URI, IDirtyResource> uri2dirtyResource; + protected EditingDomainAdapter(TransactionalEditingDomain editingDomain) { + this.editingDomain = editingDomain; + editingDomain.addResourceSetListener(this); + dirtyStateManager = Access.getIDirtyStateManager().get(); + uri2dirtyResource = new HashMap<URI, IDirtyResource>(); + Lifecycle lifecycle = TransactionUtil.getAdapter(editingDomain, Lifecycle.class); + lifecycle.addTransactionalEditingDomainListener(this); } - protected class TransactionalEditingDomainListenerImpl implements TransactionalEditingDomainListener { - - @Override - public void transactionStarting(TransactionalEditingDomainEvent event) { - - } - - @Override - public void transactionInterrupted(TransactionalEditingDomainEvent event) { - - } - - @Override - public void transactionStarted(TransactionalEditingDomainEvent event) { - - } + public NotificationFilter getFilter() { + return null; + } - @Override - public void transactionClosing(TransactionalEditingDomainEvent event) { + public boolean isAggregatePrecommitListener() { + return true; + } - } + public boolean isPostcommitOnly() { + return false; + } - @Override - public void transactionClosed(TransactionalEditingDomainEvent event) { + public boolean isPrecommitOnly() { + return false; + } + public void resourceSetChanged(ResourceSetChangeEvent event) { + List<URI> remainingURIs = Lists.newArrayList(uri2dirtyResource.keySet()); + for (Resource resource : editingDomain.getResourceSet().getResources()) { + if (resource instanceof XtextResource) { + XtextResource xtextResource = (XtextResource) resource; + remainingURIs.remove(xtextResource.getURI()); + IDirtyResource dirtyResource = uri2dirtyResource.get(xtextResource.getURI()); + if (xtextResource.isModified()) { + if (dirtyResource == null) { + createAndRegisterDirtyState(xtextResource); + } + } else { + if (dirtyResource != null) { + uri2dirtyResource.remove(xtextResource.getURI()); + dirtyStateManager.discardDirtyState(dirtyResource); + } + } + } } - - @Override - public void editingDomainDisposing(TransactionalEditingDomainEvent event) { - dispose(); + // removed resources + for (URI remainingURI : remainingURIs) { + IDirtyResource dirtyResource = uri2dirtyResource.get(remainingURI); + dirtyStateManager.discardDirtyState(dirtyResource); + uri2dirtyResource.remove(remainingURI); } - - } - - private DiagramEditorBase diagramEditor; - private TransactionalEditingDomain editingDomain; - private IDirtyStateManager dirtyStateManager; - private Map<URI, IDirtyResource> uri2dirtyResource; - private TransactionalEditingDomainListenerImpl editingDomainListener; - private IPartListener uiPartListener; - - public DirtyResourceTracker(DiagramEditorBase diagramEditor) { - this.diagramEditor = diagramEditor; - this.editingDomain = diagramEditor.getEditingDomain(); - this.dirtyStateManager = Access.getIDirtyStateManager().get(); - this.uri2dirtyResource = new HashMap<URI, IDirtyResource>(); - this.editingDomainListener = new TransactionalEditingDomainListenerImpl(); - - Lifecycle lifecycle = TransactionUtil.getAdapter(editingDomain, Lifecycle.class); - lifecycle.addTransactionalEditingDomainListener(editingDomainListener); - editingDomain.addResourceSetListener(new ResourceSetListenerImpl()); - - uiPartListener = new PartListenerImpl(); - diagramEditor.getSite().getWorkbenchWindow().getPartService().addPartListener(uiPartListener); } - /** - * If execution of command is about to complete, check concurrent modification and prompt dialog - * @throws RollbackException - */ - public void checkConcurrentModificationOnTransaction() throws RollbackException { + public Command transactionAboutToCommit(ResourceSetChangeEvent event) throws RollbackException { List<XtextResource> resourcesWithConflicts = null; for (Resource resource : editingDomain.getResourceSet().getResources()) { if (resource instanceof XtextResource && resource.isModified()) { @@ -219,73 +150,30 @@ public class DirtyResourceTracker { } } if (resourcesWithConflicts != null) { - if (userApplyChanges()) { + if (queryApplyChanges()) { for (XtextResource resourceWithConflicts : resourcesWithConflicts) { try { IDirtyResource dirtyResource = createDirtyResource(resourceWithConflicts); // assert resource is serializable dirtyResource.getContents(); dirtyStateManager.announceDirtyStateChanged(dirtyResource); - } - catch (Exception exc) { - System.err.println("Error serializing resource: " + exc); + } catch (Exception exc) { + System.err.println("Error serializing resource: "+exc); } } - } - else { + } else { throw new RollbackException(new Status(IStatus.ERROR, UIBaseActivator.PLUGIN_ID, "Transaction aborted by user")); } } - } - - /** - * Issue: Undo changes via change recording look like resource changes.<br> - * Thus resource gets dirty state if {@link DiagramEditorBase#isDirty()} and {@link Resource#isModified()}. - */ - public void updateDirtyStateOnEditorDeactivation() { - if (!diagramEditor.isDirty()) { - for (URI uri : uri2dirtyResource.keySet()) - dirtyStateManager.discardDirtyState(uri2dirtyResource.get(uri)); - uri2dirtyResource.clear(); - } else - setResourcesDirtyState(); - } - - protected void setResourcesDirtyState() { - List<URI> remainingURIs = Lists.newArrayList(uri2dirtyResource.keySet()); - for (Resource resource : editingDomain.getResourceSet().getResources()) { - if (resource instanceof XtextResource) { - XtextResource xtextResource = (XtextResource) resource; - remainingURIs.remove(xtextResource.getURI()); - IDirtyResource dirtyResource = uri2dirtyResource.get(xtextResource.getURI()); - if (xtextResource.isModified()) { - if (dirtyResource == null) { - createAndRegisterDirtyState(xtextResource); - } - } - else { - if (dirtyResource != null) { - uri2dirtyResource.remove(xtextResource.getURI()); - dirtyStateManager.discardDirtyState(dirtyResource); - } - } - } - } - // removed resources - for (URI remainingURI : remainingURIs) { - IDirtyResource dirtyResource = uri2dirtyResource.get(remainingURI); - dirtyStateManager.discardDirtyState(dirtyResource); - uri2dirtyResource.remove(remainingURI); - } + return null; } protected boolean createAndRegisterDirtyState(XtextResource xtextResource) { IDirtyResource dirtyResource = createDirtyResource(xtextResource); if (dirtyResource == null) { return true; - } - else { + } else { boolean isSuccess = dirtyStateManager.manageDirtyState(dirtyResource); if (isSuccess) { uri2dirtyResource.put(xtextResource.getURI(), dirtyResource); @@ -303,23 +191,66 @@ public class DirtyResourceTracker { return new SimpleDirtyResource(xtextResource, resourceServiceProvider); } - protected boolean userApplyChanges() { + public void editingDomainDisposing(TransactionalEditingDomainEvent event) { + dispose(); + } + + public void dispose() { + if (uri2dirtyResource != null) { + for (IDirtyResource dirtyResource : uri2dirtyResource.values()) { + dirtyStateManager.discardDirtyState(dirtyResource); + } + uri2dirtyResource = null; + } + Lifecycle lifecycle = TransactionUtil.getAdapter(editingDomain, Lifecycle.class); + if (lifecycle != null) { + lifecycle.removeTransactionalEditingDomainListener(this); + } + editingDomain.removeResourceSetListener(this); + } + + protected boolean queryApplyChanges() { DialogPrompter dialogPrompter = new DialogPrompter(); Display.getDefault().syncExec(dialogPrompter); boolean yesResult = dialogPrompter.isYesResult(); return yesResult; } - public void dispose() { - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService().removePartListener(uiPartListener); + protected class DialogPrompter implements Runnable { - for (IDirtyResource dirtyResource : uri2dirtyResource.values()) - dirtyStateManager.discardDirtyState(dirtyResource); - uri2dirtyResource.clear(); - - Lifecycle lifecycle = TransactionUtil.getAdapter(editingDomain, Lifecycle.class); - if (lifecycle != null) - lifecycle.removeTransactionalEditingDomainListener(editingDomainListener); + private boolean isYesResult; + + public boolean isYesResult() { + return isYesResult; + } + + public void run() { + Shell shell = Display.getDefault().getActiveShell(); + isYesResult = MessageDialog.open(MessageDialog.QUESTION, shell, "Concurrent Modification", + "Other editors have a modified version of models you are going to change.\n" + + "If you apply your changes you are loosing the possibility to save the others.\n" + + "Apply changes anyway?", SWT.NONE); + } + } + + public void transactionClosed(TransactionalEditingDomainEvent event) { + // do nothing + } + + public void transactionClosing(TransactionalEditingDomainEvent event) { + // do nothing + } + + public void transactionInterrupted(TransactionalEditingDomainEvent event) { + // do nothing + } + + public void transactionStarted(TransactionalEditingDomainEvent event) { + // do nothing + } + + public void transactionStarting(TransactionalEditingDomainEvent event) { + // do nothing } } diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java index 4db446392..87fb2ff0b 100644 --- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java @@ -33,7 +33,6 @@ import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.etrice.core.fsm.fSM.ModelComponent; import org.eclipse.etrice.core.fsm.ui.FSMUiModule; import org.eclipse.etrice.ui.common.base.UIBaseActivator; -import org.eclipse.etrice.ui.common.base.concurrency.DirtyResourceTracker; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.ui.editor.DiagramBehavior; @@ -235,8 +234,6 @@ public abstract class DiagramEditorBase extends DiagramEditor implements IInputU */ // if (AutoUpdateFeature.isLastDoneChanges()) doSave(new NullProgressMonitor()); - - DirtyResourceTracker.register(this); } /** |