/*******************************************************************************
* Copyright (c) 2012 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.xpect.ui.editor;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.URI;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
import org.osgi.framework.Bundle;
import org.xpect.XpectJavaModel;
import org.xpect.registry.ILanguageInfo;
import org.xpect.ui.XpectPluginActivator;
import org.xpect.ui.util.XpectUtil;
import org.xpect.util.IXtInjectorProvider;
import org.xpect.util.ReflectionUtil;
import org.xpect.util.URIDelegationHandler;
import com.google.inject.Injector;
/**
* @author Moritz Eysholdt - Initial contribution and API
*/
public class XtEditorExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
@Override
protected Bundle getBundle() {
return XpectPluginActivator.getInstance().getBundle();
}
@Override
protected Injector getInjector() {
IFile file = getFileOfCurrentlyOpeningEditor();
if (file == null)
throw new RuntimeException("Could not determine which editor is currently being opened.");
String ext = new URIDelegationHandler().getOriginalFileExtension(file.getName());
ILanguageInfo info = ILanguageInfo.Registry.INSTANCE.getLanguageByFileExtension(ext);
if (info == null)
throw new RuntimeException("There is no Xtext-language installed for file extension '" + ext + "'.");
XpectJavaModel javaModel = XpectUtil.loadJavaModel(file);
URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
if (uri == null)
throw new RuntimeException("Could not determine URI for IFile " + file.getFullPath().toString());
return IXtInjectorProvider.INSTANCE.getInjector(javaModel, uri);
}
protected IWorkbenchPage getActiveWorkbenchPage() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
if (page != null)
return page;
Object perspectiveSwitcher = ReflectionUtil.readField(window, "perspectiveSwitcher", Object.class);
if (perspectiveSwitcher == null)
return null;
Object reorderListener = ReflectionUtil.readField(perspectiveSwitcher, "reorderListener", Object.class);
if (reorderListener == null)
return null;
Object parent = ReflectionUtil.getParentObject(reorderListener);
if (parent instanceof IWorkbenchPage)
return (IWorkbenchPage) parent;
return null;
}
protected IFile getFileOfCurrentlyOpeningEditor() {
try {
IWorkbenchPage page = getActiveWorkbenchPage();
if (page != null) {
IEditorReference[] references = page.getEditorReferences();
// iterate backwards, because the new editor is likely to be at
// the end of the list
for (int i = references.length - 1; i >= 0; i--)
// only care about Xt-Editors that are *not* yet initialized
if (references[i].getId().equals(XpectPluginActivator.XT_EDITOR_ID) && references[i].getPart(false) == null) {
IEditorInput input = references[i].getEditorInput();
if (input instanceof IFileEditorInput)
return ((IFileEditorInput) input).getFile();
}
}
return null;
} catch (PartInitException e) {
throw new RuntimeException();
}
}
}