Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Haug2015-04-23 09:51:11 +0000
committerJuergen Haug2015-04-23 09:52:07 +0000
commitb7fa7ba01ea372770adb58bea7d406557aac4ff9 (patch)
tree7d1d8f85c72a19afcfd8c7f5b88744d31c4021aa
parent010c1cb56cfc69d47da1b49ea0dcc5e9794f674e (diff)
downloadorg.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.java95
-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.java3
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);
}
/**

Back to the top