/******************************************************************************* * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. * 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 *******************************************************************************/ package org.eclipse.xtext.gmf.glue.concurrency; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor; 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 GMF and Xtext editors based on Xtext's dirty state management. * * @author koehnlein */ public class ConcurrentModificationObserver implements IPartListener { private EditingDomainAdapter.Factory factory; /** * This element comes from the XText/GMF integration example, and was not originally documented. * @param activePage */ 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) { if (part instanceof DiagramEditor) { TransactionalEditingDomain editingDomain = ((DiagramEditor) part).getEditingDomain(); factory.adapt(editingDomain, EditingDomainAdapter.class); } } public void partClosed(IWorkbenchPart part) { if (part instanceof DiagramEditor) { // as long as bug 299920 is not fixed, we have to dispose the adapter manually TransactionalEditingDomain editingDomain = ((DiagramEditor) part).getEditingDomain(); if (editingDomain != null) { EditingDomainAdapter adapter = (EditingDomainAdapter) factory.adapt(editingDomain, EditingDomainAdapter.class); if (adapter != null) { adapter.dispose(); } } } } public void partActivated(IWorkbenchPart part) { // do nothing } public void partDeactivated(IWorkbenchPart part) { // do nothing } public void partBroughtToTop(IWorkbenchPart part) { // do nothing } /** * This element comes from the XText/GMF integration example, and was not originally documented. */ 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)); } }); } } }