blob: 5e4c99f5780c825975a43c10b70a08c8fbdfb5ca [file] [log] [blame]
/**
* Copyright (c) 2000, 2009 IBM Corporation and others.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Thales Corporate Services S.A.S
*/
package org.eclipse.egf.common.ui.helper;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.egf.common.ui.EGFCommonUIPlugin;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.part.FileEditorInput;
import org.osgi.framework.Bundle;
public class EditorHelper {
public static void setSelectionToViewer(IEditorPart part, List<EObject> eObjects) {
// Do we have something to process
if (eObjects == null || eObjects.size() == 0) {
return;
}
// Select
try {
Class<?>[] types = new Class[] {
Class.forName("java.util.Collection")}; //$NON-NLS-1$
Method method = part.getClass().getMethod("setSelectionToViewer", types); //$NON-NLS-1$
if (method != null) {
Object[] params = new Object[] {
eObjects
};
method.invoke(part, params);
}
} catch (Throwable t) {
ThrowableHandler.handleThrowable(EGFCommonUIPlugin.getDefault().getPluginID(), t);
}
}
public static void setSelectionToViewer(IEditorPart part, URI uri) {
// Do we have something to process
if (uri == null || uri.hasFragment() == false) {
return;
}
// Whether or not could we have an EditingDomain
if (part == null || part instanceof IEditingDomainProvider == false) {
return;
}
EditingDomain editingDomain = ((IEditingDomainProvider) part).getEditingDomain();
// Process URI
EObject eObject = editingDomain.getResourceSet().getEObject(uri, true);
if (eObject == null) {
return;
}
// Select
try {
Class<?>[] types = new Class[] {
Class.forName("java.util.Collection")}; //$NON-NLS-1$
Method method = part.getClass().getMethod("setSelectionToViewer", types); //$NON-NLS-1$
if (method != null) {
Object[] params = new Object[] {
Collections.singletonList(eObject)
};
method.invoke(part, params);
}
} catch (Throwable t) {
// Nothing to do
}
}
public static void openEditorsAndSelect(Map<Resource, List<EObject>> resources) {
// is there something to select
if (resources.isEmpty()) {
return;
}
for (Iterator<Map.Entry<Resource, List<EObject>>> it = resources.entrySet().iterator(); it.hasNext();) {
try {
Map.Entry<Resource, List<EObject>> entry = it.next();
// Try to use a URIConverter to normalize such URI
// if we have a platform:/plugin/ we need a platform:/resource/ if any
// to have a chance to use a FileEditorInput rather than an URIEditorInput
Resource resource = entry.getKey();
URI uri = resource.getURI();
if (uri != null && resource.getResourceSet() != null) {
URIConverter converter = resource.getResourceSet().getURIConverter();
if (converter != null) {
uri = converter.normalize(uri);
}
}
IEditorPart editorPart = openEditor(uri);
if (editorPart != null) {
setSelectionToViewer(editorPart, entry.getValue());
}
} catch (Throwable t) {
ThrowableHandler.handleThrowable(EGFCommonUIPlugin.getDefault().getPluginID(), t);
}
}
}
public static String computeEditorId(String fileName) {
IWorkbench workbench = PlatformUI.getWorkbench();
IEditorRegistry editorRegistry = workbench.getEditorRegistry();
IEditorDescriptor descriptor = editorRegistry.getDefaultEditor(fileName);
if (descriptor != null) {
return descriptor.getId();
}
return EditorsUI.DEFAULT_TEXT_EDITOR_ID;
}
public static IEditorInput getEditorInput(URI uri) {
if (uri == null || uri.isEmpty() || "//#".equals(uri)) { //$NON-NLS-1$
return null;
}
if (uri.isPlatformResource()) {
String path = uri.toPlatformString(true);
IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
if (resource instanceof IFile) {
return EclipseUtil.createFileEditorInput((IFile) resource);
}
}
return new URIEditorInput(uri.trimFragment());
}
/**
* Opens the default editor for the resource that contains the specified
* EObject.
*/
public static IEditorPart openEditor(URI uri) throws PartInitException {
if (uri == null) {
return null;
}
IEditorPart part = restoreAlreadyOpenedEditor(uri, null, true);
if (part != null) {
return part;
}
IEditorInput editorInput = null;
if (uri.isPlatformResource()) {
String path = uri.toPlatformString(true);
IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
if (resource instanceof IFile) {
editorInput = EclipseUtil.createFileEditorInput((IFile) resource);
return openEditor(editorInput, URI.createPlatformPluginURI(resource.getFullPath().toString(), false));
}
}
return openEditor(new URIEditorInput(uri.trimFragment()), uri);
}
/**
* Opens the default editor for the resource that contains the specified
* EObject.
*/
public static IEditorPart openEditor(URI uri, String editorId) throws PartInitException {
if (uri == null) {
return null;
}
IEditorPart part = restoreAlreadyOpenedEditor(uri, editorId, true);
if (part != null) {
return part;
}
IEditorInput editorInput = null;
if (uri.isPlatformResource()) {
String path = uri.toPlatformString(true);
IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
if (resource instanceof IFile) {
editorInput = EclipseUtil.createFileEditorInput((IFile) resource);
return openEditor(editorInput, URI.createPlatformPluginURI(resource.getFullPath().toString(), false), editorId);
}
}
return openEditor(new URIEditorInput(uri.trimFragment()), uri, editorId);
}
public static IEditorPart openEditor(IEditorInput input, URI uri) throws PartInitException {
return openEditor(input, uri, null);
}
public static IEditorPart openEditor(IEditorInput input, URI uri, String editorId) throws PartInitException {
if (input == null || uri == null) {
return null;
}
IEditorPart part = restoreAlreadyOpenedEditor(uri, editorId, true);
if (part != null) {
return part;
}
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage();
return page.openEditor(input, editorId != null ? editorId : computeEditorId(uri.trimFragment().lastSegment()), true, IWorkbenchPage.MATCH_NONE);
}
public static boolean isAlreadyOpenedEditor(URI uri) {
if (uri == null) {
return false;
}
return restoreAlreadyOpenedEditor(uri, null, false) != null ? true : false;
}
private static IEditorPart restoreAlreadyOpenedEditor(URI uri, String editorId, boolean activate) {
if (uri == null) {
return null;
}
URI uriToCheck = uri.trimFragment();
IWorkbench workbench = PlatformUI.getWorkbench();
if (workbench == null) {
return null;
}
for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
for (IWorkbenchPage innerPage : window.getPages()) {
for (IEditorReference reference : innerPage.getEditorReferences()) {
try {
IEditorInput editorInput = reference.getEditorInput();
if (editorInput != null) {
URI editorInputURI = EditorHelper.getURI(editorInput);
if (editorInputURI != null && editorInputURI.equals(uriToCheck)) {
IEditorPart part = reference.getEditor(true);
if (editorId != null && editorId.equals(part.getEditorSite().getId()) == false) {
continue;
}
if (activate) {
window.setActivePage(innerPage);
innerPage.activate(part);
part.setFocus();
}
return part;
}
}
} catch (PartInitException pie) {
// Just Ignore
}
}
}
}
return null;
}
public static URI getURI(IEditorInput editorInput) {
URI result = null;
if (EMFPlugin.IS_ECLIPSE_RUNNING) {
result = EclipseUtil.getURI(editorInput);
}
if (result == null) {
if (editorInput instanceof URIEditorInput) {
result = ((URIEditorInput) editorInput).getURI().trimFragment();
} else {
result = URI.createURI(editorInput.getName());
}
}
return result;
}
public static class EclipseUtil {
static final Class<?> FILE_CLASS;
static {
Class<?> fileClass = null;
try {
fileClass = IFile.class;
} catch (Throwable exception) {
// Ignore any exceptions and assume the class isn't available.
}
FILE_CLASS = fileClass;
}
static final Class<?> FILE_REVISION_CLASS;
static final Method FILE_REVISION_GET_URI_METHOD;
static {
Class<?> fileRevisionClass = null;
Method fileRevisionGetURIMethod = null;
Bundle bundle = Platform.getBundle("org.eclipse.team.core"); //$NON-NLS-1$
if (bundle != null && (bundle.getState() & (Bundle.ACTIVE | Bundle.STARTING | Bundle.RESOLVED)) != 0) {
try {
fileRevisionClass = bundle.loadClass("org.eclipse.team.core.history.IFileRevision"); //$NON-NLS-1$
fileRevisionGetURIMethod = fileRevisionClass.getMethod("getURI"); //$NON-NLS-1$
} catch (Throwable exeption) {
// Ignore any exceptions and assume the class isn't available.
}
}
FILE_REVISION_CLASS = fileRevisionClass;
FILE_REVISION_GET_URI_METHOD = fileRevisionGetURIMethod;
}
static final Class<?> URI_EDITOR_INPUT_CLASS;
static {
Class<?> uriEditorInputClass = null;
try {
uriEditorInputClass = IURIEditorInput.class;
} catch (Throwable exception) {
// The class is not available.
}
URI_EDITOR_INPUT_CLASS = uriEditorInputClass;
}
public static URI getURI(IEditorInput editorInput) {
if (FILE_CLASS != null) {
IFile file = getIFile(editorInput);
if (file != null) {
return URI.createPlatformPluginURI(file.getFullPath().toString(), false);
}
}
if (FILE_REVISION_CLASS != null) {
Object fileRevision = editorInput.getAdapter(FILE_REVISION_CLASS);
if (fileRevision != null) {
try {
return URI.createURI(((java.net.URI) FILE_REVISION_GET_URI_METHOD.invoke(fileRevision)).toString());
} catch (Throwable t) {
EGFCommonUIPlugin.getDefault().logError(t);
}
}
}
if (URI_EDITOR_INPUT_CLASS != null) {
if (editorInput instanceof IURIEditorInput) {
return URI.createURI(((IURIEditorInput) editorInput).getURI().toString()).trimFragment();
}
}
return null;
}
public static IFile getIFile(IEditorInput editorInput) {
if (FILE_CLASS != null) {
return (IFile) editorInput.getAdapter(FILE_CLASS);
}
return null;
}
public static IURIEditorInput createFileEditorInput(IFile file) {
return new FileEditorInput(file);
}
}
}