/** * Copyright (c) 2013 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.ui.editor.partitioning; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput; 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.IDiagramDocumentProvider; 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.diagram.ui.resources.editor.ide.document.FileEditorInputProxy; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; /** * Implementation of the {@link IDiagramDocumentProvider} interface that extends * a {@link FileDiagramDocumentProvider}. * * In addition to the {@link FileDiagramDocumentProvider}, this implementation * acts on a shared editing domain and can handle custom * {@link DiagramEditorInput}. It also unloads non used resources with help of * the {@link ResourceUnloadingTool} * * @author andreas muelder - Initial contribution and API * */ public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProvider { /** * Extension of {@link DiagramFileInfo} that stores the given * {@link IEditorInput} which is required for the * {@link ResourceUnloadingTool} */ protected class InputDiagramFileInfo extends DiagramFileInfo { private final IEditorInput editorInput; public InputDiagramFileInfo(IDocument document, FileSynchronizer fileSynchronizer, DiagramModificationListener listener, IEditorInput editorInput) { super(document, fileSynchronizer, listener); this.editorInput = editorInput; } public IEditorInput getEditorInput() { return editorInput; } } public IEditorInput createInputWithEditingDomain(IEditorInput editorInput, TransactionalEditingDomain domain) { if (editorInput instanceof DiagramEditorInput) { return editorInput; } return super.createInputWithEditingDomain(editorInput, DiagramPartitioningUtil.getSharedDomain()); } /** * Sets the {@link EditingDomain} to the shared instance */ @Override protected IDocument createEmptyDocument() { DiagramDocument diagramDocument = new DiagramDocument(); diagramDocument.setEditingDomain(DiagramPartitioningUtil.getSharedDomain()); return diagramDocument; } @Override protected ElementInfo createElementInfo(Object element) throws CoreException { ElementInfo info = super.createElementInfo(element); if (element instanceof IDiagramEditorInput) { Resource eResource = ((IDiagramEditorInput) element).getDiagram().eResource(); TransactionalEditingDomain sharedDomain = DiagramPartitioningUtil.getSharedDomain(); if (eResource.isLoaded() && !sharedDomain.isReadOnly(eResource) && eResource.isModified()) { info.fCanBeSaved = true; } } return info; } protected FileInfo createFileInfo(IDocument document, FileSynchronizer synchronizer, IFileEditorInput input) { assert document instanceof DiagramDocument; DiagramModificationListener diagramListener = null; if (((DiagramDocument) document).getDiagram() != null) { diagramListener = new FileDiagramModificationListener(this, (DiagramDocument) document, input); } InputDiagramFileInfo info = new InputDiagramFileInfo(document, synchronizer, diagramListener, input); if (diagramListener != null) diagramListener.startListening(); return info; } @Override protected boolean setDocumentContent(IDocument document, IEditorInput editorInput) throws CoreException { if (editorInput instanceof IDiagramEditorInput) { Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram(); document.setContent(diagram); return true; } else if (editorInput instanceof FileEditorInputProxy) { setDocumentContentFromStorage(document, ((FileEditorInputProxy) editorInput).getFile()); return true; } return super.setDocumentContent(document, editorInput); } @Override protected void disposeElementInfo(Object element, ElementInfo info) { Object content = info.fDocument.getContent(); info.fDocument.setContent(null); // Unset the content first to avoid call to DiagramIOUtil.unload super.disposeElementInfo(element, info); info.fDocument.setContent(content); if (content instanceof Diagram && info instanceof InputDiagramFileInfo) { // Unload non needed resources ResourceUnloadingTool.unloadEditorInput(DiagramPartitioningUtil.getSharedDomain().getResourceSet(), ((InputDiagramFileInfo) info).getEditorInput()); } } }