blob: 26f412a661e36ba7433ef40df1286e32a17f8d0d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency
* 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:
* Pierre Allard,
* Regent L'Archeveque,
* Olivier L. Larouche - initial API and implementation
*
* SPDX-License-Identifier: EPL-1.0
*
*******************************************************************************/
package org.eclipse.apogy.core.invocator.ui.composites;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.apogy.common.emf.ApogyCommonEMFFacade;
import org.eclipse.apogy.common.emf.Described;
import org.eclipse.apogy.common.emf.Named;
import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorFacade;
import org.eclipse.apogy.core.invocator.Program;
import org.eclipse.apogy.core.invocator.ProgramsGroup;
import org.eclipse.apogy.core.invocator.ProgramsList;
import org.eclipse.apogy.core.invocator.ScriptBasedProgramsGroup;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
public class NewScriptBasedProgramComposite extends Composite {
private DataBindingContext m_currentDataBindings;
private final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
private ProgramsList programsList;
private ScriptBasedProgramsGroup group;
private EClass eClass;
private final Composite compositeGroup;
private final Composite compositeType;
private final TreeViewer treeViewerGroups;
private final TreeViewer treeViewerTypes;
public NewScriptBasedProgramComposite(Composite parent, int style) {
super(parent, style);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginHeight = 0;
setLayout(gridLayout);
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (NewScriptBasedProgramComposite.this.m_currentDataBindings != null) {
NewScriptBasedProgramComposite.this.m_currentDataBindings.dispose();
}
}
});
this.compositeGroup = new Composite(this, SWT.NONE);
this.compositeGroup.setLayout(new GridLayout(1, false));
this.compositeGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Label lblGroup = new Label(this.compositeGroup, SWT.NONE);
lblGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
lblGroup.setText("Group");
this.treeViewerGroups = new TreeViewer(this.compositeGroup, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
Tree treeGroups = this.treeViewerGroups.getTree();
treeGroups.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
treeGroups.setLinesVisible(true);
ColumnViewerToolTipSupport.enableFor(this.treeViewerGroups);
TreeViewerColumn treeViewerProgramsGroupColumnItem_Name = new TreeViewerColumn(this.treeViewerGroups, SWT.NONE);
TreeColumn trclmnProgramsGroupItemName = treeViewerProgramsGroupColumnItem_Name.getColumn();
trclmnProgramsGroupItemName.setWidth(200);
trclmnProgramsGroupItemName.setText("Name");
this.treeViewerGroups.setContentProvider(new ProgramsGroupContentProvider(this.adapterFactory));
this.treeViewerGroups.setLabelProvider(new GroupsLabelProvider());
this.compositeType = new Composite(this, SWT.NONE);
this.compositeType.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
this.compositeType.setLayout(new GridLayout(1, false));
Label lblProgramType = new Label(this.compositeType, SWT.NONE);
lblProgramType.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
lblProgramType.setText("Program Type");
this.treeViewerTypes = new TreeViewer(this.compositeType, SWT.BORDER);
Tree treeTypes = this.treeViewerTypes.getTree();
treeTypes.setLinesVisible(true);
treeTypes.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
ColumnViewerToolTipSupport.enableFor(this.treeViewerGroups);
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(this.treeViewerTypes, SWT.NONE);
TreeColumn treeColumn = treeViewerColumn.getColumn();
treeColumn.setWidth(200);
treeColumn.setText("Name");
this.treeViewerTypes.setContentProvider(new ProgramsTypeContentProvider(this.adapterFactory));
this.treeViewerTypes.setLabelProvider(new TypesLabelProvider());
}
public TreeViewer getTreeViewerGroups() {
return this.treeViewerGroups;
}
public TreeViewer getTreeViewerTypes() {
return this.treeViewerTypes;
}
private class TypesLabelProvider extends StyledCellLabelProvider {
@Override
public void update(ViewerCell cell) {
if (cell.getElement() instanceof EClass) {
cell.setText(((EClass) cell.getElement()).getName());
}
}
@Override
public String getToolTipText(Object element) {
if (element instanceof Described) {
return ((Described) element).getDescription();
}
return super.getToolTipText(element);
}
}
private class GroupsLabelProvider extends StyledCellLabelProvider {
@Override
public void update(ViewerCell cell) {
if (cell.getElement() instanceof ProgramsGroup<?>) {
cell.setText(((Named) cell.getElement()).getName());
}
}
@Override
public String getToolTipText(Object element) {
if (element instanceof Described) {
return ((Described) element).getDescription();
}
return super.getToolTipText(element);
}
@Override
public Point getToolTipShift(Object object) {
return new Point(5, 5);
}
@Override
public int getToolTipDisplayDelayTime(Object object) {
return 500;
}
@Override
public int getToolTipTimeDisplayed(Object object) {
return 5000;
}
}
public void setProgramSuperClass(EClass programSuperClass) {
this.eClass = programSuperClass;
if (programSuperClass != null) {
if (this.m_currentDataBindings != null) {
this.m_currentDataBindings.dispose();
}
this.m_currentDataBindings = initDataBindings();
}
}
/**
* Returns the selected program.
*
* @return Reference to the selected {@link Program}.
*/
public Program getSelectedProgramTypes() {
TreeSelection selection = (TreeSelection) this.treeViewerTypes.getSelection();
return (Program) selection.getFirstElement();
}
/**
* Returns the selected program.
*
* @return Reference to the selected {@link Program}.
*/
public Program getSelectedProgramGroup() {
TreeSelection selection = (TreeSelection) this.treeViewerGroups.getSelection();
return (Program) selection.getFirstElement();
}
private class ProgramsTypeContentProvider extends AdapterFactoryContentProvider {
public ProgramsTypeContentProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
@Override
public Object[] getElements(Object inputElement) {
if (NewScriptBasedProgramComposite.this.eClass != null) {
return ApogyCommonEMFFacade.INSTANCE.getAllSubEClasses(NewScriptBasedProgramComposite.this.eClass)
.toArray();
}
Object[] objects = new Object[0];
return objects;
}
@Override
public boolean hasChildren(Object object) {
return false;
}
}
private class ProgramsGroupContentProvider extends AdapterFactoryContentProvider {
public ProgramsGroupContentProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
@Override
public Object[] getElements(Object object) {
if (object instanceof ProgramsList) {
List<ScriptBasedProgramsGroup> groups = new ArrayList<ScriptBasedProgramsGroup>();
for (ProgramsGroup<? extends Program> group : ((ProgramsList) object).getProgramsGroups()) {
if (group instanceof ScriptBasedProgramsGroup) {
groups.add((ScriptBasedProgramsGroup) group);
}
}
return groups.toArray();
}
return null;
}
@Override
public boolean hasChildren(Object object) {
return false;
}
}
public void setProgramsList(ProgramsList programsList) {
this.programsList = programsList;
if (programsList != null) {
if (this.m_currentDataBindings != null) {
this.m_currentDataBindings.dispose();
}
this.m_currentDataBindings = initDataBindings();
}
}
public void setProgramsList(ProgramsList programsList, ScriptBasedProgramsGroup selectedGroup) {
this.group = selectedGroup;
setProgramsList(programsList);
}
protected DataBindingContext initDataBindings() {
return initDataBindingsCustom();
}
protected DataBindingContext initDataBindingsCustom() {
DataBindingContext bindingContext = new DataBindingContext();
if (this.programsList != null) {
if (!this.treeViewerGroups.getTree().isDisposed()) {
this.treeViewerGroups.setInput(this.programsList);
if (this.group == null) {
if (this.programsList.getProgramsGroups() != null
&& this.programsList.getProgramsGroups().size() > 0) {
this.treeViewerGroups
.setSelection(new StructuredSelection(this.programsList.getProgramsGroups().get(0)));
}
} else {
this.treeViewerGroups.setSelection(new StructuredSelection(this.group));
}
}
}
if (!this.treeViewerTypes.getTree().isDisposed()) {
this.treeViewerTypes.setInput(ApogyCoreInvocatorFacade.INSTANCE.getActiveInvocatorSession());
}
return bindingContext;
}
}