blob: 2290e6d4dfbc37bc8ff8e4217442b9ad04d16d6f [file] [log] [blame]
package org.eclipse.gmf.examples.eclipsecon.diagram.part;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.MultiRule;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.DemultiplexingListener;
import org.eclipse.emf.transaction.NotificationFilter;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramModificationListener;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.ui.IFileEditorInput;
/**
* @generated
*/
public class EclipseconDocumentProvider extends FileDiagramDocumentProvider {
/**
* @generated
*/
protected void saveDocumentToFile(IDocument document, IFile file,
boolean overwrite, IProgressMonitor monitor) throws CoreException {
Diagram diagram = (Diagram) document.getContent();
Resource diagramResource = diagram.eResource();
IDiagramDocument diagramDocument = (IDiagramDocument) document;
TransactionalEditingDomain domain = diagramDocument.getEditingDomain();
List resources = domain.getResourceSet().getResources();
monitor.beginTask("Saving diagram", resources.size() + 1); //$NON-NLS-1$
super.saveDocumentToFile(document, file, overwrite,
new SubProgressMonitor(monitor, 1));
for (Iterator it = resources.iterator(); it.hasNext();) {
Resource nextResource = (Resource) it.next();
monitor.setTaskName("Saving " + nextResource.getURI()); //$NON-NLS-1$
if (nextResource != diagramResource) {
try {
nextResource.save(Collections.EMPTY_MAP);
} catch (IOException e) {
EclipseconDiagramEditorPlugin
.getInstance()
.logError(
"Unable to save resource: " + nextResource.getURI(), e); //$NON-NLS-1$
}
}
monitor.worked(1);
}
monitor.done();
}
/**
* @generated
*/
protected ISchedulingRule getSaveRule(Object element) {
IDiagramDocument diagramDocument = getDiagramDocument(element);
if (diagramDocument != null) {
Diagram diagram = diagramDocument.getDiagram();
if (diagram != null) {
Collection rules = new ArrayList();
for (Iterator it = diagramDocument.getEditingDomain()
.getResourceSet().getResources().iterator(); it
.hasNext();) {
IFile nextFile = WorkspaceSynchronizer
.getFile((Resource) it.next());
if (nextFile != null) {
rules.add(computeSaveSchedulingRule(nextFile));
}
}
return new MultiRule((ISchedulingRule[]) rules
.toArray(new ISchedulingRule[rules.size()]));
}
}
return super.getSaveRule(element);
}
/**
* @generated
*/
protected FileInfo createFileInfo(IDocument document,
FileSynchronizer synchronizer, IFileEditorInput input) {
assert document instanceof DiagramDocument;
DiagramModificationListener diagramListener = new CustomModificationListener(
this, (DiagramDocument) document, input);
DiagramFileInfo info = new DiagramFileInfo(document, synchronizer,
diagramListener);
diagramListener.startListening();
return info;
}
/**
* @generated
*/
private ISchedulingRule computeSaveSchedulingRule(IResource toCreateOrModify) {
if (toCreateOrModify.exists()
&& toCreateOrModify.isSynchronized(IResource.DEPTH_ZERO))
return fResourceRuleFactory.modifyRule(toCreateOrModify);
IResource parent = toCreateOrModify;
do {
/*
* XXX This is a workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=67601
* IResourceRuleFactory.createRule should iterate the hierarchy itself.
*/
toCreateOrModify = parent;
parent = toCreateOrModify.getParent();
} while (parent != null && !parent.exists()
&& !parent.isSynchronized(IResource.DEPTH_ZERO));
return fResourceRuleFactory.createRule(toCreateOrModify);
}
/**
* @generated
*/
private class CustomModificationListener extends
FileDiagramModificationListener {
/**
* @generated
*/
private DemultiplexingListener myListener = null;
/**
* @generated
*/
public CustomModificationListener(
EclipseconDocumentProvider documentProviderParameter,
DiagramDocument documentParameter,
IFileEditorInput inputParameter) {
super(documentProviderParameter, documentParameter, inputParameter);
final DiagramDocument document = documentParameter;
NotificationFilter diagramResourceModifiedFilter = NotificationFilter
.createEventTypeFilter(Notification.SET);
myListener = new DemultiplexingListener(
diagramResourceModifiedFilter) {
protected void handleNotification(
TransactionalEditingDomain domain,
Notification notification) {
if (notification.getNotifier() instanceof EObject) {
Resource modifiedResource = ((EObject) notification
.getNotifier()).eResource();
if (modifiedResource != document.getDiagram()
.eResource()) {
document.setContent(document.getContent());
}
}
}
};
}
/**
* @generated
*/
public void startListening() {
super.startListening();
getEditingDomain().addResourceSetListener(myListener);
}
/**
* @generated
*/
public void stopListening() {
getEditingDomain().removeResourceSetListener(myListener);
super.stopListening();
}
}
}