| /******************************************************************************* |
| * 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 - initial API and implementation |
| * |
| * SPDX-License-Identifier: EPL-1.0 |
| *******************************************************************************/ |
| package org.eclipse.apogy.core.ui.composites; |
| |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| |
| import org.eclipse.apogy.common.emf.Named; |
| import org.eclipse.apogy.common.emf.Timed; |
| import org.eclipse.apogy.common.emf.edit.utils.ApogyCommonEMFEditUtilsFacade; |
| import org.eclipse.apogy.common.math.ApogyCommonMathFacade; |
| import org.eclipse.apogy.common.math.Tuple3d; |
| import org.eclipse.apogy.core.OperationCallPositionedResult; |
| import org.eclipse.apogy.core.invocator.Context; |
| import org.eclipse.apogy.core.invocator.DataProductsList; |
| import org.eclipse.apogy.core.invocator.DataProductsListsContainer; |
| import org.eclipse.apogy.core.invocator.OperationCallResult; |
| import org.eclipse.apogy.core.invocator.OperationCallResultsList; |
| import org.eclipse.core.databinding.DataBindingContext; |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.edit.provider.ComposedAdapterFactory; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.ITableColorProvider; |
| import org.eclipse.jface.viewers.ITableLabelProvider; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.TreeViewerColumn; |
| import org.eclipse.jface.window.ToolTip; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.DisposeEvent; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.swt.widgets.TreeColumn; |
| import org.eclipse.ui.PlatformUI; |
| |
| public class DataProductsListsContainerComposite extends Composite { |
| private DataBindingContext m_currentDataBindings; |
| |
| private final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( |
| ComposedAdapterFactory.Descriptor.Registry.INSTANCE); |
| private TreeViewer treeViewer; |
| |
| private DataProductsListsContainer dataProductsListsContainer; |
| |
| private ISelectionChangedListener treeViewerSelectionChangedListener; |
| |
| public DataProductsListsContainerComposite(Composite parent, int style) { |
| super(parent, style); |
| setLayout(new GridLayout(1, true)); |
| |
| this.treeViewer = new TreeViewer(this, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL); |
| ColumnViewerToolTipSupport.enableFor(this.treeViewer, ToolTip.NO_RECREATE); |
| Tree tree = this.treeViewer.getTree(); |
| tree.setHeaderVisible(true); |
| tree.setLinesVisible(true); |
| tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
| |
| TreeViewerColumn treeViewerColumnItem_Name = new TreeViewerColumn(this.treeViewer, SWT.NONE); |
| TreeColumn trclmnItem = treeViewerColumnItem_Name.getColumn(); |
| trclmnItem.setWidth(350); |
| trclmnItem.setText("Name"); |
| |
| TreeViewerColumn treeViewerColumnItem_Time = new TreeViewerColumn(this.treeViewer, SWT.NONE); |
| TreeColumn trclmnTime = treeViewerColumnItem_Time.getColumn(); |
| trclmnTime.setWidth(200); |
| trclmnTime.setText("Time"); |
| |
| TreeViewerColumn treeViewerColumnItem_Context = new TreeViewerColumn(this.treeViewer, SWT.NONE); |
| TreeColumn trclmnContext = treeViewerColumnItem_Context.getColumn(); |
| trclmnContext.setWidth(100); |
| trclmnContext.setText("Context"); |
| |
| TreeViewerColumn treeViewerColumnItem_Position = new TreeViewerColumn(this.treeViewer, SWT.NONE); |
| TreeColumn trclmnPosition = treeViewerColumnItem_Position.getColumn(); |
| trclmnPosition.setWidth(150); |
| trclmnPosition.setText("Position"); |
| |
| TreeViewerColumn treeViewerColumnItem_Orientation = new TreeViewerColumn(this.treeViewer, SWT.NONE); |
| TreeColumn trclmnOrientation = treeViewerColumnItem_Orientation.getColumn(); |
| trclmnOrientation.setWidth(150); |
| trclmnOrientation.setText("Orientation"); |
| |
| TreeViewerColumn treeViewerColumnItem_Exception = new TreeViewerColumn(this.treeViewer, SWT.NONE); |
| TreeColumn trclmnException = treeViewerColumnItem_Exception.getColumn(); |
| trclmnException.setWidth(120); |
| trclmnException.setText("Value"); |
| |
| this.treeViewer.setContentProvider(new AdapterFactoryContentProvider(this.adapterFactory) { |
| @Override |
| public Object[] getChildren(Object object) { |
| if (object instanceof DataProductsListsContainer || object instanceof DataProductsList |
| || object instanceof OperationCallResultsList) { |
| return super.getChildren(object); |
| } else { |
| return null; |
| } |
| } |
| |
| @Override |
| public boolean hasChildren(Object object) { |
| if (object instanceof DataProductsListsContainer || object instanceof DataProductsList |
| || object instanceof OperationCallResultsList) { |
| return super.hasChildren(object); |
| } else { |
| return false; |
| } |
| } |
| }); |
| this.treeViewer.setLabelProvider(new DataProductsListsContainerLabelProvider(this.adapterFactory)); |
| |
| this.treeViewer.addSelectionChangedListener(getTreeViewerSelectionChangedListener()); |
| |
| addDisposeListener(new DisposeListener() { |
| @Override |
| public void widgetDisposed(DisposeEvent e) { |
| if (DataProductsListsContainerComposite.this.m_currentDataBindings != null) { |
| DataProductsListsContainerComposite.this.m_currentDataBindings.dispose(); |
| } |
| DataProductsListsContainerComposite.this.treeViewer |
| .removeSelectionChangedListener(getTreeViewerSelectionChangedListener()); |
| } |
| }); |
| } |
| |
| /** |
| * Returns the Tree Viewer Selection Listener. |
| * |
| * @return Tree selection listener singleton. |
| */ |
| private ISelectionChangedListener getTreeViewerSelectionChangedListener() { |
| if (this.treeViewerSelectionChangedListener == null) { |
| this.treeViewerSelectionChangedListener = new ISelectionChangedListener() { |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) { |
| DataProductsListsContainerComposite.this.newSelection(event.getSelection()); |
| } |
| }; |
| } |
| return this.treeViewerSelectionChangedListener; |
| } |
| |
| /** |
| * This method is called when a new selection is made in the parentComposite. |
| * |
| * @param selection Reference to the selection. |
| */ |
| protected void newSelection(ISelection selection) { |
| } |
| |
| /** |
| * Sets the {@link DataProductsListsContainer} to be displayed in the |
| * parentComposite. |
| * |
| * @param dataProductsListsContainer Reference to the |
| * {@link DataProductsListsContainer}. |
| */ |
| public void setDataProductsListsContainer(DataProductsListsContainer dataProductsListsContainer) { |
| this.dataProductsListsContainer = dataProductsListsContainer; |
| |
| if (dataProductsListsContainer != null) { |
| if (this.m_currentDataBindings != null) { |
| this.m_currentDataBindings.dispose(); |
| } |
| this.m_currentDataBindings = initDataBindings(); |
| } |
| } |
| |
| /** |
| * Initializes the bindings. Invokes {@link #initDataBindingsCustom()}. This |
| * pattern is used to prevent Window Pro Builder to erase custom implementation. |
| * |
| * @return Bindings context. |
| */ |
| protected DataBindingContext initDataBindings() { |
| return initDataBindingsCustom(); |
| } |
| |
| /** |
| * Initializes the bindings. Invokes {@link #initDataBindingsCustom()}. |
| * |
| * @return Bindings context. |
| */ |
| protected DataBindingContext initDataBindingsCustom() { |
| DataBindingContext bindingContext = new DataBindingContext(); |
| |
| if (this.dataProductsListsContainer != null) { |
| if (!this.treeViewer.getTree().isDisposed()) { |
| this.treeViewer.setInput(this.dataProductsListsContainer); |
| this.treeViewer.expandAll(); |
| } |
| } |
| |
| return bindingContext; |
| } |
| |
| /** |
| * |
| * Label Provider. |
| * |
| */ |
| private class DataProductsListsContainerLabelProvider extends AdapterFactoryLabelProvider |
| implements ITableLabelProvider, ITableColorProvider { |
| |
| private final static int NAME_COLUMN_ID = 0; |
| private final static int TIME_COLUMN_ID = 1; |
| private final static int CONTEXT_COLUMN_ID = 2; |
| private final static int POSITION_COLUMN_ID = 3; |
| private final static int ORIENTATION_COLUMN_ID = 4; |
| private final static int VALUE_COLUMN_ID = 5; |
| |
| public DataProductsListsContainerLabelProvider(AdapterFactory adapterFactory) { |
| super(adapterFactory); |
| } |
| |
| @Override |
| public String getColumnText(Object object, int columnIndex) { |
| String str = "<undefined>"; |
| |
| switch (columnIndex) { |
| case NAME_COLUMN_ID: |
| if (object instanceof Named) { |
| str = ApogyCommonEMFEditUtilsFacade.INSTANCE.getText(object); |
| } else if (object instanceof OperationCallResult) { |
| OperationCallResult result = (OperationCallResult) object; |
| str = ApogyCommonEMFEditUtilsFacade.INSTANCE.getText(result.getOperationCall()); |
| } |
| break; |
| |
| case TIME_COLUMN_ID: |
| str = ""; |
| if (object instanceof Timed) { |
| Date date = ((Timed) object).getTime(); |
| str = date == null ? "N/A." |
| : new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS").format(((Timed) object).getTime()); |
| } |
| break; |
| |
| case CONTEXT_COLUMN_ID: |
| str = ""; |
| if (object instanceof OperationCallResult) { |
| Context context = ((OperationCallResult) object).getContext(); |
| str = ApogyCommonEMFEditUtilsFacade.INSTANCE.getText(context); |
| } |
| break; |
| |
| case POSITION_COLUMN_ID: |
| str = ""; |
| if (object instanceof OperationCallResult) { |
| if (object instanceof OperationCallPositionedResult) { |
| OperationCallPositionedResult result = (OperationCallPositionedResult) object; |
| if (result.getPose() == null) { |
| str = "Null"; |
| } else { |
| Tuple3d position = ApogyCommonMathFacade.INSTANCE.extractPosition(result.getPose()); |
| str = ApogyCommonEMFEditUtilsFacade.INSTANCE.getText(position); |
| } |
| } else { |
| str = "N/A."; |
| } |
| } |
| break; |
| |
| case ORIENTATION_COLUMN_ID: |
| str = ""; |
| if (object instanceof OperationCallResult) { |
| if (object instanceof OperationCallPositionedResult) { |
| OperationCallPositionedResult result = (OperationCallPositionedResult) object; |
| if (result.getPose() == null) { |
| str = "Null"; |
| } else { |
| |
| Tuple3d orientation = ApogyCommonMathFacade.INSTANCE.extractOrientation(result.getPose()); |
| /** Convert in degrees. */ |
| orientation.setX(Math.toDegrees(orientation.getX())); |
| orientation.setY(Math.toDegrees(orientation.getY())); |
| orientation.setZ(Math.toDegrees(orientation.getZ())); |
| |
| str = ApogyCommonEMFEditUtilsFacade.INSTANCE.getText(orientation); |
| } |
| } else { |
| str = "N/A."; |
| } |
| } |
| break; |
| |
| case VALUE_COLUMN_ID: |
| str = ""; |
| if (object instanceof OperationCallResult) { |
| OperationCallResult result = (OperationCallResult) object; |
| |
| if (result.getExceptionContainer() != null |
| && result.getExceptionContainer().getException() != null) { |
| str = result.getExceptionContainer().getException().getMessage(); |
| } else { |
| str = result.getResultValue() == null ? "Null" |
| : ApogyCommonEMFEditUtilsFacade.INSTANCE.getText(result.getResultValue()); |
| } |
| } |
| break; |
| |
| default: |
| break; |
| } |
| |
| return str; |
| } |
| |
| @Override |
| public Image getColumnImage(Object object, int columnIndex) { |
| return null; |
| } |
| |
| @Override |
| public Color getBackground(Object object, int columnIndex) { |
| Color color = super.getBackground(object, columnIndex); |
| |
| /** Put the background in red if any exception occurred on the call. */ |
| if (object instanceof OperationCallResult) { |
| OperationCallResult opResult = (OperationCallResult) object; |
| if (opResult.getExceptionContainer() != null |
| && opResult.getExceptionContainer().getException() != null) { |
| color = PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_RED); |
| } |
| } |
| return color; |
| } |
| } |
| } |