/******************************************************************************* * Copyright (c) 2008 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 de.itemis.gmf.runtime.editingdomain; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.transaction.NotificationFilter; import org.eclipse.emf.transaction.TransactionalEditingDomain; public class SharedEditingDomainUtil { public static final String TYPE_REGISTRY_CLIENT_CONTEXT_ID = "SharedClientContext"; public static TransactionalEditingDomain getSharedEditingDomain(String id) { TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE .getEditingDomain(id); addResourceTrackingModificationAdapter(editingDomain); SharedResourceSetInfoDelegate.adapt(editingDomain); return editingDomain; } private static final class SetTrackModificationAdapter implements Adapter { private final NotificationFilter diagramResourceModifiedFilter; private Notifier myTarget; private SetTrackModificationAdapter( NotificationFilter diagramResourceModifiedFilter) { this.diagramResourceModifiedFilter = diagramResourceModifiedFilter; } public Notifier getTarget() { return myTarget; } public boolean isAdapterForType(Object type) { return type == SetTrackModificationAdapter.class; } public void notifyChanged(Notification notification) { if (diagramResourceModifiedFilter.matches(notification)) { Object value = notification.getNewValue(); if (value instanceof Resource) { ((Resource) value).setTrackingModification(true); } } } public void setTarget(Notifier newTarget) { myTarget = newTarget; } } private static void addResourceTrackingModificationAdapter( TransactionalEditingDomain editingDomain) { EList<Adapter> adapters = editingDomain.getResourceSet().eAdapters(); Adapter adapter = EcoreUtil.getAdapter(adapters, SetTrackModificationAdapter.class); if (adapter == null) { final NotificationFilter diagramResourceModifiedFilter = NotificationFilter .createNotifierFilter(editingDomain.getResourceSet()).and( NotificationFilter .createEventTypeFilter(Notification.ADD)) .and( NotificationFilter.createFeatureFilter( ResourceSet.class, ResourceSet.RESOURCE_SET__RESOURCES)); adapters.add(new SetTrackModificationAdapter( diagramResourceModifiedFilter)); } } }