blob: f15b5c9b3ea45bd53e9999e7159df811b9797ddf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2017 BestSolution.at 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
*
* Contributors:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
******************************************************************************/
package org.eclipse.e4.tools.emf.ui.internal.common.uistructure;
import java.util.Collections;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.RegistryFactory;
import org.eclipse.e4.tools.emf.ui.common.IScriptingSupport;
import org.eclipse.e4.tools.emf.ui.internal.Messages;
import org.eclipse.e4.tools.emf.ui.internal.common.ControlHighlighter;
import org.eclipse.e4.tools.services.IResourcePool;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.e4.ui.model.internal.ModelUtils;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.IEMFValueProperty;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class UIViewer {
public TreeViewer createViewer(Composite parent, EStructuralFeature feature, final IObservableValue master, IResourcePool resourcePool, final Messages messages) {
final TreeViewer viewer = new TreeViewer(parent);
viewer.setContentProvider(new WidgetContentProvider());
viewer.setLabelProvider(new WidgetLabelProvider(resourcePool));
IEMFValueProperty property = EMFProperties.value(feature);
IObservableValue value = property.observeDetail(master);
value.addValueChangeListener(event -> {
if (event.diff.getNewValue() != null) {
viewer.setInput(Collections.singleton(event.diff.getNewValue()));
viewer.expandToLevel(2);
} else {
viewer.setInput(Collections.emptyList());
}
});
final MenuManager mgr = new MenuManager();
mgr.setRemoveAllWhenShown(true);
mgr.addMenuListener(manager -> {
final Object o = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
if (o instanceof Control) {
manager.add(new Action(messages.ModelEditor_ShowControl) {
@Override
public void run() {
ControlHighlighter.show((Control) o);
}
});
}
IExtensionRegistry registry = RegistryFactory.getRegistry();
IExtensionPoint extPoint = registry.getExtensionPoint("org.eclipse.e4.tools.emf.ui.scripting"); //$NON-NLS-1$
final IConfigurationElement[] elements = extPoint.getConfigurationElements();
final IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
if (elements.length > 0 && !s.isEmpty()) {
MenuManager scriptExecute = new MenuManager(messages.ModelEditor_Script);
manager.add(scriptExecute);
for (IConfigurationElement e : elements) {
final IConfigurationElement le = e;
scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$
@Override
public void run() {
try {
MApplicationElement o = (MApplicationElement) master.getValue();
IScriptingSupport support = (IScriptingSupport) le.createExecutableExtension("class"); //$NON-NLS-1$
support.openEditor(viewer.getControl().getShell(), s.getFirstElement(),
ModelUtils.getContainingContext(o));
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
});
viewer.getControl().setMenu(mgr.createContextMenu(viewer.getControl()));
return viewer;
}
}