/*******************************************************************************
* 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 org.yakindu.sct.ui.editor.partitioning;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
public class ResourceUnloadingTool {
public static void unloadEditorInput(ResourceSet resourceSet, IEditorInput editorInput) {
final EList<Resource> resources = resourceSet.getResources();
final List<Resource> resourcesToUnload = new ArrayList<Resource>(resources);
IEditorReference[] editorReferences;
try {
editorReferences = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.getEditorReferences();
} catch (final NullPointerException exc) {
// Workbench is not yet created or being disposed, so do nothing
// see bug http://code.google.com/p/gmftools/issues/detail?id=9
return;
}
for (final IEditorReference openEditorReference : editorReferences) {
try {
final IEditorInput openEditorInput = openEditorReference.getEditorInput();
if (openEditorInput != editorInput) {
final IEditorPart openEditor = openEditorReference.getEditor(false);
if (openEditor instanceof IEditingDomainProvider) {
final IEditingDomainProvider openDiagramEditor = (IEditingDomainProvider) openEditor;
final ResourceSet diagramResourceSet = openDiagramEditor.getEditingDomain().getResourceSet();
if (diagramResourceSet == resourceSet) {
final Resource diagramResource = getDiagramResource(diagramResourceSet, openEditorInput);
resourcesToUnload.remove(diagramResource);
final Collection<?> imports = EMFCoreUtil.getImports(diagramResource);
resourcesToUnload.removeAll(imports);
}
}
}
} catch (final Exception exc) {
exc.printStackTrace();
}
}
for (final Resource resourceToUnload : resourcesToUnload) {
try {
resourceToUnload.unload();
resources.remove(resourceToUnload);
} catch (final Throwable t) {
t.printStackTrace();
}
}
}
private static Resource getDiagramResource(ResourceSet resourceSet, IEditorInput editorInput) {
Resource diagramResource = null;
if (editorInput instanceof URIEditorInput) {
final URI resourceURI = ((URIEditorInput) editorInput).getURI().trimFragment();
diagramResource = resourceSet.getResource(resourceURI, false);
} else if (editorInput instanceof IDiagramEditorInput) {
final Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
diagramResource = diagram.eResource();
} else if (editorInput instanceof IFileEditorInput) {
final URI resourceURI = URI.createPlatformResourceURI(((IFileEditorInput) editorInput).getFile()
.getFullPath().toString(), true);
diagramResource = resourceSet.getResource(resourceURI, false);
}
return diagramResource;
}
}