| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 IBM Corporation 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 |
| // |
| // Contributors: |
| // IBM Corporation - initial implementation |
| //------------------------------------------------------------------------------ |
| /* |
| * Copyright (c) 2005, 2006 IBM Corporation 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 |
| * |
| * Contributors: |
| * IBM Corporation - initial implementation |
| * |
| */ |
| package org.eclipse.epf.diagramming.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.epf.diagramming.base.providers.DiagramEditorDocumentProvider; |
| 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; |
| |
| /** |
| * @modified |
| */ |
| public class UMLDocumentProvider extends DiagramEditorDocumentProvider { |
| |
| /** |
| * @modified |
| */ |
| 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 && nextResource.isLoaded()) { |
| // try { |
| // nextResource.save(Collections.EMPTY_MAP); |
| // } catch (IOException e) { |
| // EPFDiagramEditorPlugin |
| // .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); |
| } |
| |
| /** |
| * @modified |
| */ |
| 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); |
| DiagramFileInfoSync info = new DiagramFileInfoSync(document, |
| synchronizer, diagramListener, input); |
| |
| 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( |
| UMLDocumentProvider 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(); |
| } |
| |
| } |
| |
| } |