Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Haug2015-05-04 10:52:27 +0000
committerJuergen Haug2015-05-06 17:43:21 +0000
commitad17f996677b822effed3a5f00c8045e8ac6c12e (patch)
tree5aa0298e529b0b8463a4fb77b86ffc7b97a4c3d0 /plugins/org.eclipse.etrice.ui.common.base
parent50e78dc81bf55963a53d064a00bf2f2a46cbf080 (diff)
downloadorg.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
Diffstat (limited to 'plugins/org.eclipse.etrice.ui.common.base')
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/.options2
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/build.properties3
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/ConcurrentModificationObserver.java7
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/concurrency/EditingDomainAdapter.java35
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateConnectionFeature.java31
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCreateFeature.java29
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ChangeAwareCustomFeature.java35
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/ResourceChangeRecorder.java83
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;
+ }
+}

Back to the top