/*******************************************************************************
 * 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;
		}

	}
}
