blob: 3f6c071f775072ca3950a788697f8662a5c52314 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2016 BestSolution.at and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
******************************************************************************/
package org.eclipse.e4.tools.compat.internal;
import java.lang.reflect.Method;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Platform;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.tools.services.IClipboardService;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.WorkbenchPart;
public class PartHelper {
private static final String ORG_ECLIPSE_E4_UI_WORKBENCH_I_PRESENTATION_ENGINE = "org.eclipse.e4.ui.workbench.IPresentationEngine"; //$NON-NLS-1$
public static IEclipseContext createPartContext(WorkbenchPart part) throws PartInitException {
final IWorkbenchPartSite site = part.getSite();
final IEclipseContext parentContext = site.getService(IEclipseContext.class);
// Check if running in 4.x
if (parentContext.get(ORG_ECLIPSE_E4_UI_WORKBENCH_I_PRESENTATION_ENGINE) != null) {
// Hack to get the MPart-Context
try {
final Class<?> clazz = Platform.getBundle("org.eclipse.e4.ui.model.workbench").loadClass( //$NON-NLS-1$
"org.eclipse.e4.ui.model.application.ui.basic.MPart"); //$NON-NLS-1$
final Object instance = site.getService(clazz);
final Method m = clazz.getMethod("getContext", new Class[0]); //$NON-NLS-1$
IEclipseContext ctx = (IEclipseContext) m.invoke(instance);
final IEclipseContext rv = ctx;
while (ctx.getParent() != null) {
ctx = ctx.getParent();
}
ctx.set(IClipboardService.class, new ClipboardServiceImpl());
return rv;
} catch (final Exception e) {
throw new PartInitException("Could not create context", e); //$NON-NLS-1$
}
}
return parentContext.createChild("EditPart('" + part.getPartName() + "')"); //$NON-NLS-1$ //$NON-NLS-2$
}
public static <C> C createComponent(Composite parent, IEclipseContext context, Class<C> clazz, WorkbenchPart part) {
final ISelectionProvider s = new SelectionProviderImpl();
context.set(ISelectionProvider.class, s);
part.getSite().setSelectionProvider(s);
final IStylingEngine styleEngine = context.get(IStylingEngine.class);
final Composite comp = new Composite(parent, SWT.NONE);
comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
// FIXME This should be read from the CSS
final FillLayout layout = new FillLayout();
comp.setLayout(layout);
context.set(Composite.class.getName(), comp);
final C component = ContextInjectionFactory.make(clazz, context);
styleEngine.setClassname(comp, part.getClass().getSimpleName());
return component;
}
static class SelectionProviderImpl implements ISelectionProvider {
private ISelection currentSelection = StructuredSelection.EMPTY;
private final ListenerList<ISelectionChangedListener> listeners = new ListenerList<>();
@Override
public void setSelection(ISelection selection) {
currentSelection = selection;
final SelectionChangedEvent evt = new SelectionChangedEvent(this, selection);
for (final ISelectionChangedListener l : listeners) {
l.selectionChanged(evt);
}
}
@Override
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
listeners.remove(listener);
}
@Override
public ISelection getSelection() {
return currentSelection;
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
}
public static void disposeContextIfE3(IEclipseContext parentContext,
IEclipseContext context) {
// Check if running in 3.x, otherwise there was no dedicated context
// created
if (parentContext
.get(ORG_ECLIPSE_E4_UI_WORKBENCH_I_PRESENTATION_ENGINE) == null) {
context.dispose();
context = null;
}
}
}