diff options
author | Juergen Haug | 2015-05-04 10:52:27 +0000 |
---|---|---|
committer | Juergen Haug | 2015-05-06 17:43:21 +0000 |
commit | ad17f996677b822effed3a5f00c8045e8ac6c12e (patch) | |
tree | 5aa0298e529b0b8463a4fb77b86ffc7b97a4c3d0 /plugins/org.eclipse.etrice.ui.common.base | |
parent | 50e78dc81bf55963a53d064a00bf2f2a46cbf080 (diff) | |
download | org.eclipse.etrice-ad17f996677b822effed3a5f00c8045e8ac6c12e.tar.gz org.eclipse.etrice-ad17f996677b822effed3a5f00c8045e8ac6c12e.tar.xz org.eclipse.etrice-ad17f996677b822effed3a5f00c8045e8ac6c12e.zip |
[ui] concurrent modification restricted on etrice and undo change
recording fix
Change-Id: Ibddfa9481e33b98aeb5e5c864fa746b60e1dc24e
Diffstat (limited to 'plugins/org.eclipse.etrice.ui.common.base')
8 files changed, 142 insertions, 83 deletions
diff --git a/plugins/org.eclipse.etrice.ui.common.base/.options b/plugins/org.eclipse.etrice.ui.common.base/.options new file mode 100644 index 000000000..8c79f1833 --- /dev/null +++ b/plugins/org.eclipse.etrice.ui.common.base/.options @@ -0,0 +1,2 @@ +org.eclipse.etrice.ui.common.base/debug = true +org.eclipse.etrice.ui.common.base/trace/ResourceChangeRecorder = true
\ No newline at end of file diff --git a/plugins/org.eclipse.etrice.ui.common.base/build.properties b/plugins/org.eclipse.etrice.ui.common.base/build.properties index e9863e281..060a9e9fd 100644 --- a/plugins/org.eclipse.etrice.ui.common.base/build.properties +++ b/plugins/org.eclipse.etrice.ui.common.base/build.properties @@ -2,4 +2,5 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ - plugin.xml + plugin.xml,\ + .options 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 index bd4f0ad1c..8f7f826d2 100644 --- 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 @@ -15,6 +15,7 @@ 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.etrice.ui.common.base.editor.DiagramEditorBase; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; @@ -47,6 +48,9 @@ public class ConcurrentModificationObserver implements IPartListener { } public void partOpened(IWorkbenchPart part) { + if(!(part instanceof DiagramEditorBase)) + return; + Object adapter = part.getAdapter(IEditingDomainProvider.class); if (adapter instanceof IEditingDomainProvider) { EditingDomain editingDomain = ((IEditingDomainProvider) adapter).getEditingDomain(); @@ -56,6 +60,9 @@ public class ConcurrentModificationObserver implements IPartListener { } public void partClosed(IWorkbenchPart part) { + if(!(part instanceof DiagramEditorBase)) + return; + Object adapter = part.getAdapter(IEditingDomainProvider.class); if (adapter instanceof IEditingDomainProvider) { EditingDomain editingDomain = ((IEditingDomainProvider) adapter).getEditingDomain(); diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java index f27099d0b..8cb48c357 100644 --- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java @@ -54,7 +54,7 @@ public class EditingDomainAdapter extends AdapterImpl implements ResourceSetList public static class Factory extends AdapterFactoryImpl { @Override public boolean isFactoryForType(Object type) { - return super.isFactoryForType(type == EditingDomainAdapter.class); + return type == EditingDomainAdapter.class; } @Override @@ -90,20 +90,9 @@ public class EditingDomainAdapter extends AdapterImpl implements ResourceSetList lifecycle.addTransactionalEditingDomainListener(this); } - public NotificationFilter getFilter() { - return null; - } - - public boolean isAggregatePrecommitListener() { - return true; - } - - public boolean isPostcommitOnly() { - return false; - } - - public boolean isPrecommitOnly() { - return false; + @Override + public boolean isAdapterForType(Object type) { + return EditingDomainAdapter.class == type; } public void resourceSetChanged(ResourceSetChangeEvent event) { @@ -232,6 +221,22 @@ public class EditingDomainAdapter extends AdapterImpl implements ResourceSetList + "Apply changes anyway?", SWT.NONE); } } + + public NotificationFilter getFilter() { + return null; + } + + public boolean isAggregatePrecommitListener() { + return true; + } + + public boolean isPostcommitOnly() { + return false; + } + + public boolean isPrecommitOnly() { + return false; + } public void transactionClosed(TransactionalEditingDomainEvent event) { // do nothing diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateConnectionFeature.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateConnectionFeature.java index 6abca6fa3..e7b4e0e4a 100644 --- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateConnectionFeature.java +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateConnectionFeature.java @@ -13,9 +13,7 @@ package org.eclipse.etrice.ui.common.base.support; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.change.ChangeDescription; -import org.eclipse.emf.ecore.change.util.BasicChangeRecorder; -import org.eclipse.emf.ecore.change.util.ChangeRecorder; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.features.context.ICreateConnectionContext; import org.eclipse.graphiti.features.context.ICreateContext; @@ -26,39 +24,28 @@ import org.eclipse.graphiti.mm.pictograms.Connection; public abstract class ChangeAwareCreateConnectionFeature extends AbstractCreateConnectionFeature { - boolean hasDoneChanges; + protected ResourceChangeRecorder changeRecorder = null; public ChangeAwareCreateConnectionFeature(IFeatureProvider fp, String name, String description) { super(fp, name, description); - this.hasDoneChanges = false; } @Override public Connection create(ICreateConnectionContext context) { - EObject rootObject = getContainerModelObject(context); - BasicChangeRecorder changeRecorder = new ChangeRecorder(rootObject); + changeRecorder = new ResourceChangeRecorder(getContainerResource(context)); Connection result = doCreate(context); boolean newObjects = result != null; - ChangeDescription cd = changeRecorder.endRecording(); - hasDoneChanges = !(cd.getObjectChanges().isEmpty() - && cd.getObjectsToAttach().isEmpty() - && cd.getObjectsToDetach().isEmpty() && cd.getResourceChanges() - .isEmpty()); - - if (!newObjects && hasDoneChanges){ - cd.apply(); - hasDoneChanges = false; - } - + changeRecorder.endRecording(!newObjects); + return result; } @Override public final boolean hasDoneChanges() { - return hasDoneChanges; + return changeRecorder.hasResourceChanged(); } /** @@ -67,9 +54,9 @@ public abstract class ChangeAwareCreateConnectionFeature extends protected abstract Connection doCreate(ICreateConnectionContext context); /** - * Return the model object, that holds all changed objects for the given context + * Return the resource, that holds all changed objects for the given context */ - protected EObject getContainerModelObject(ICreateConnectionContext context){ - return (EObject) getBusinessObjectForPictogramElement(getDiagram()); + protected Resource getContainerResource(ICreateConnectionContext context){ + return ((EObject) getBusinessObjectForPictogramElement(getDiagram())).eResource(); } } diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateFeature.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateFeature.java index e682b63bf..1a1f0b83b 100644 --- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateFeature.java +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateFeature.java @@ -13,47 +13,34 @@ package org.eclipse.etrice.ui.common.base.support; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.change.ChangeDescription; -import org.eclipse.emf.ecore.change.util.BasicChangeRecorder; -import org.eclipse.emf.ecore.change.util.ChangeRecorder; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.features.context.ICreateContext; import org.eclipse.graphiti.features.impl.AbstractCreateFeature; public abstract class ChangeAwareCreateFeature extends AbstractCreateFeature { - boolean hasDoneChanges; + protected ResourceChangeRecorder changeRecorder = null; public ChangeAwareCreateFeature(IFeatureProvider fp, String name, String description) { super(fp, name, description); - this.hasDoneChanges = false; } @Override public final Object[] create(ICreateContext context) { - EObject rootObject = getContainerModelObject(context); - BasicChangeRecorder changeRecorder = new ChangeRecorder(rootObject); + changeRecorder = new ResourceChangeRecorder(getContainerResource(context)); Object[] result = doCreate(context); boolean newObjects = result != null && result.length > 0; - ChangeDescription cd = changeRecorder.endRecording(); - hasDoneChanges = !(cd.getObjectChanges().isEmpty() - && cd.getObjectsToAttach().isEmpty() - && cd.getObjectsToDetach().isEmpty() && cd.getResourceChanges() - .isEmpty()); - - if (!newObjects && hasDoneChanges){ - cd.apply(); - hasDoneChanges = false; - } + changeRecorder.endRecording(!newObjects); return result; } @Override public final boolean hasDoneChanges() { - return hasDoneChanges; + return changeRecorder.hasResourceChanged(); } /** @@ -62,9 +49,9 @@ public abstract class ChangeAwareCreateFeature extends AbstractCreateFeature { protected abstract Object[] doCreate(ICreateContext context); /** - * Return the model object, that holds all changed objects for the given context + * Return the resource, that holds all changed objects for the given context */ - protected EObject getContainerModelObject(ICreateContext context){ - return (EObject) getBusinessObjectForPictogramElement(getDiagram()); + protected Resource getContainerResource(ICreateContext context){ + return ((EObject) getBusinessObjectForPictogramElement(getDiagram())).eResource(); } } diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCustomFeature.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCustomFeature.java index 93ea40741..ee7d0873c 100644 --- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCustomFeature.java +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCustomFeature.java @@ -13,52 +13,39 @@ package org.eclipse.etrice.ui.common.base.support; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.change.ChangeDescription; -import org.eclipse.emf.ecore.change.util.BasicChangeRecorder; -import org.eclipse.emf.ecore.change.util.ChangeRecorder; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.features.context.ICustomContext; import org.eclipse.graphiti.features.custom.AbstractCustomFeature; public abstract class ChangeAwareCustomFeature extends AbstractCustomFeature { - boolean hasDoneChanges; + protected ResourceChangeRecorder changeRecorder = null; public ChangeAwareCustomFeature(IFeatureProvider fp) { super(fp); - this.hasDoneChanges = false; } @Override - public final void execute(ICustomContext context) { - EObject rootObject = getContainerModelObject(context); - BasicChangeRecorder changeRecorder = new ChangeRecorder(rootObject); - + public final void execute(ICustomContext context){ + changeRecorder = new ResourceChangeRecorder(getContainerResource(context)); + boolean doExecute = doExecute(context); - - ChangeDescription cd = changeRecorder.endRecording(); - hasDoneChanges = !(cd.getObjectChanges().isEmpty() - && cd.getObjectsToAttach().isEmpty() - && cd.getObjectsToDetach().isEmpty() && cd.getResourceChanges() - .isEmpty()); - - if (!doExecute && hasDoneChanges){ - cd.apply(); - hasDoneChanges = false; - } + + changeRecorder.endRecording(!doExecute); } @Override public final boolean hasDoneChanges() { - return hasDoneChanges; + return changeRecorder.hasResourceChanged(); } protected abstract boolean doExecute(ICustomContext context); /** - * Return the model object, that holds all changed objects for the given context + * Return the resource, that holds all changed objects for the given context */ - protected EObject getContainerModelObject(ICustomContext context){ - return (EObject) getBusinessObjectForPictogramElement(getDiagram()); + protected Resource getContainerResource(ICustomContext context){ + return ((EObject) getBusinessObjectForPictogramElement(getDiagram())).eResource(); } } diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ResourceChangeRecorder.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ResourceChangeRecorder.java new file mode 100644 index 000000000..f94bbd14f --- /dev/null +++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ResourceChangeRecorder.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2015 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: + * Juergen Haug (initial contribution) + * + *******************************************************************************/ + +package org.eclipse.etrice.ui.common.base.support; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.emf.ecore.change.ChangeDescription; +import org.eclipse.emf.ecore.change.util.BasicChangeRecorder; +import org.eclipse.emf.ecore.change.util.ChangeRecorder; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.etrice.ui.common.base.UIBaseActivator; +import org.eclipse.ui.statushandlers.StatusManager; + +public class ResourceChangeRecorder { + + private static final String DEBUG_OPTION_RCR = "org.eclipse.etrice.ui.common.base/trace/ResourceChangeRecorder"; + + private static boolean isDebugging(){ + return UIBaseActivator.getDefault().isDebugging() + && Boolean.valueOf(Platform.getDebugOption(DEBUG_OPTION_RCR)); + } + + // static debugging + private static final boolean DEBUG; + static { + DEBUG = isDebugging(); + } + + private Resource resource; + private boolean wasResourceModifiedBefore; + private BasicChangeRecorder changeRecorder; + + private boolean result_resourceChanged = false; + + public ResourceChangeRecorder(Resource resource) { + this.resource = resource; + + // start recording + this.wasResourceModifiedBefore = resource.isModified(); + this.changeRecorder = new ChangeRecorder(resource); + } + + public void endRecording(boolean doReverse) { + ChangeDescription cd = changeRecorder.endRecording(); + + boolean hasRecordedChange = !(cd.getObjectChanges().isEmpty() && cd.getObjectsToAttach().isEmpty() + && cd.getObjectsToDetach().isEmpty() && cd.getResourceChanges().isEmpty()); + + if (DEBUG && !wasResourceModifiedBefore && (resource.isModified() != hasRecordedChange)) + StatusManager.getManager().handle( + new Status(IStatus.ERROR, UIBaseActivator.PLUGIN_ID, + "ResourceChangeRecorder: Mismatch between recording and modification flag"), + StatusManager.LOG); + + if (hasRecordedChange && doReverse) { + // undo + cd.apply(); + + // undo changes look like resource changes + // set resource unmodified, important for dirty state tracking + if (!wasResourceModifiedBefore) + resource.setModified(false); + } + + if (!doReverse && hasRecordedChange) + result_resourceChanged = true; + } + + public boolean hasResourceChanged() { + return result_resourceChanged; + } +} |