blob: 941f4358f7ce804dbc297cc6705e5e3d90446312 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 - 2017 fortiss GmbH
* 2019 Johannes Kepler University Linz
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Monika Wenger, Alois Zoitl
* - initial API and implementation and/or initial documentation
* Alois Zoitl - cleaned command stack handling for property sections
*******************************************************************************/
package org.eclipse.fordiac.ide.gef.properties;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.fordiac.ide.model.Palette.provider.PaletteItemProviderAdapterFactory;
import org.eclipse.fordiac.ide.model.data.provider.DataItemProviderAdapterFactory;
import org.eclipse.fordiac.ide.model.libraryElement.provider.LibraryElementItemProviderAdapterFactory;
import org.eclipse.fordiac.ide.ui.widget.CommandExecutor;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
public abstract class AbstractSection extends AbstractPropertySection implements CommandExecutor {
protected Object type;
protected CommandStack commandStack;
private Composite rightComposite;
private Composite leftComposite;
protected boolean createSuperControls = true;
private ComposedAdapterFactory adapterFactory;
// block updates triggered by any command
protected boolean blockRefresh = false;
protected abstract EObject getType();
protected abstract Object getInputType(Object input);
protected abstract void setInputCode();
protected abstract void setInputInit();
protected void setType(Object input) {
type = getInputType(input);
addContentAdapter();
}
@SuppressWarnings("static-method") // this method should be overrideable by subclasses
protected CommandStack getCommandStack(IWorkbenchPart part, Object input) {
return part.getAdapter(CommandStack.class);
}
@Override
public void setInput(final IWorkbenchPart part, final ISelection selection) {
Assert.isTrue(selection instanceof IStructuredSelection);
Object input = ((IStructuredSelection) selection).getFirstElement();
commandStack = getCommandStack(part, input);
if (null == commandStack) { // disable all fields
setInputCode();
}
setType(input);
setInputInit();
}
private final EContentAdapter contentAdapter = new EContentAdapter() {
@Override
public void notifyChanged(Notification notification) {
if (null != getType() && getType().eAdapters().contains(contentAdapter) && !blockRefresh) {
leftComposite.getDisplay().asyncExec(() -> {
if (!leftComposite.isDisposed()) {
refresh();
}
});
}
}
};
@Override
public void dispose() {
removeContentAdapter();
super.dispose();
}
protected void removeContentAdapter() {
if (getType() != null && getType().eAdapters().contains(contentAdapter)) {
getType().eAdapters().remove(contentAdapter);
}
}
protected void addContentAdapter() {
if (null != getType() && !getType().eAdapters().contains(contentAdapter)) {
getType().eAdapters().add(contentAdapter);
}
}
@Override
public void createControls(final Composite parent, final TabbedPropertySheetPage tabbedPropertySheetPage) {
super.createControls(parent, tabbedPropertySheetPage);
if (createSuperControls) {
parent.setLayout(new GridLayout(2, true));
parent.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
leftComposite = getWidgetFactory().createComposite(parent);
leftComposite.setLayout(new GridLayout());
leftComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
rightComposite = getWidgetFactory().createComposite(parent);
rightComposite.setLayout(new GridLayout());
rightComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
} else {
leftComposite = parent; // store the parent to be used in the content adapter
parent.setLayout(new GridLayout(1, true));
parent.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
}
}
@Override
public void executeCommand(Command cmd) {
if (null != type && null != commandStack && cmd.canExecute()) {
blockRefresh = true;
commandStack.execute(cmd);
blockRefresh = false;
}
}
protected Text createGroupText(Composite group, boolean editable) {
Text text = getWidgetFactory().createText(group, "", SWT.BORDER); //$NON-NLS-1$
text.setLayoutData(new GridData(SWT.FILL, 0, true, false));
text.setEditable(editable);
text.setEnabled(editable);
return text;
}
protected ComposedAdapterFactory getAdapterFactory() {
if (null == adapterFactory) {
adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new PaletteItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new LibraryElementItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new DataItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new EcoreItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
}
return adapterFactory;
}
protected Composite getLeftComposite() {
return leftComposite;
}
protected void setLeftComposite(Composite leftComposite) {
this.leftComposite = leftComposite;
}
protected Composite getRightComposite() {
return rightComposite;
}
protected void setRightComposite(Composite rightComposite) {
this.rightComposite = rightComposite;
}
}