/**
* Copyright (c) Red Hat, Inc., contributors and others 2013 - 2014. All rights reserved
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.tools.forge.ui.internal.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.jboss.tools.forge.ui.internal.ForgeUIPlugin;
public class IDEUtils {
private IDEUtils() {
}
public static void openFileInEditor(IFileStore fileStore, boolean activate) {
try {
IWorkbenchPage workbenchPage = getActiveWorkbenchPage();
if (workbenchPage != null) {
IEditorInput editorInput = getEditorInput(fileStore);
String editorId = getEditorId(fileStore);
IDE.openEditor(workbenchPage, editorInput, editorId, activate);
}
} catch (PartInitException e) {
ForgeUIPlugin.log(e);
}
}
private static IWorkbenchPage getActiveWorkbenchPage() {
IWorkbenchPage result = null;
IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (workbenchWindow != null) {
result = workbenchWindow.getActivePage();
}
if (result != null) {
}
return result;
}
private static IEditorInput getEditorInput(IFileStore fileStore) {
IFile workspaceFile = getWorkspaceFile(fileStore);
if (workspaceFile != null)
return new FileEditorInput(workspaceFile);
return new FileStoreEditorInput(fileStore);
}
private static IFile getWorkspaceFile(IFileStore fileStore) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile[] files = root.findFilesForLocationURI(fileStore.toURI());
files = filterNonExistentFiles(files);
if (files == null || files.length == 0)
return null;
return files[0];
}
private static IFile[] filterNonExistentFiles(IFile[] files) {
if (files == null) return null;
int length = files.length;
ArrayList<IFile> existentFiles = new ArrayList<>(length);
for (int i = 0; i < length; i++) {
if (files[i].exists())
existentFiles.add(files[i]);
}
return existentFiles.toArray(new IFile[existentFiles.size()]);
}
private static String getEditorId(IFileStore fileStore) throws PartInitException {
String name = fileStore.fetchInfo().getName();
IContentType contentType = null;
try {
InputStream is = null;
try {
is = fileStore.openInputStream(EFS.NONE, null);
contentType = Platform.getContentTypeManager().findContentTypeFor(is, name);
} finally {
if (is != null) {
is.close();
}
}
} catch (CoreException ex) {
// continue without content type
} catch (IOException ex) {
// continue without content type
}
IEditorRegistry editorReg = PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor defaultEditor = editorReg.getDefaultEditor(name, contentType);
defaultEditor = IDE.overrideDefaultEditorAssociation(new FileStoreEditorInput(fileStore), contentType, defaultEditor);
return getEditorDescriptor(name, editorReg, defaultEditor).getId();
}
private static IEditorDescriptor getEditorDescriptor(
String name,
IEditorRegistry editorReg,
IEditorDescriptor defaultDescriptor)
throws PartInitException {
if (defaultDescriptor != null) {
return defaultDescriptor;
}
IEditorDescriptor editorDesc = defaultDescriptor;
if (editorReg.isSystemInPlaceEditorAvailable(name)) {
editorDesc = editorReg
.findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
}
if (editorDesc == null
&& editorReg.isSystemExternalEditorAvailable(name)) {
editorDesc = editorReg
.findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
}
if (editorDesc == null) {
editorDesc = editorReg
.findEditor("org.eclipse.ui.DefaultTextEditor");
}
if (editorDesc == null) {
throw new PartInitException(
"An appropriate editor could not be found");
}
return editorDesc;
}
}