blob: 9853138fc8dba7447957c56d14e726a3cf260a64 [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 - initial API and implementation
* Regent L'Archeveque
*
* SPDX-License-Identifier: EPL-1.0
*******************************************************************************/
package org.eclipse.apogy.addons.ui.composites;
import java.util.Iterator;
import java.util.List;
import org.eclipse.apogy.addons.ApogyAddonsFacade;
import org.eclipse.apogy.addons.ApogyAddonsPackage;
import org.eclipse.apogy.addons.SimpleTool;
import org.eclipse.apogy.addons.SimpleToolList;
import org.eclipse.apogy.addons.ui.AbstractToolEClassSettings;
import org.eclipse.apogy.addons.ui.ApogyAddonsUIFactory;
import org.eclipse.apogy.common.emf.ApogyCommonEMFFacade;
import org.eclipse.apogy.common.emf.ui.wizards.ApogyEObjectWizard;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
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.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SimpleToolListComposite extends Composite {
private static final Logger Logger = LoggerFactory.getLogger(SimpleToolListComposite.class);
private final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
private DataBindingContext m_bindingContext;
private TableViewer viewer;
private Button btnNew;
private Button btnDelete;
private SimpleToolList simpleToolList;
private Adapter adapter;
public SimpleToolListComposite(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout(2, false));
// Table Viewer
this.viewer = new TableViewer(this, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
Table table = this.viewer.getTable();
GridData gd_table = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 2);
gd_table.minimumWidth = 600;
gd_table.widthHint = 600;
table.setLayoutData(gd_table);
table.setLinesVisible(true);
ColumnViewerToolTipSupport.enableFor(this.viewer);
this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
newSimpleToolSelected((SimpleTool) ((IStructuredSelection) event.getSelection()).getFirstElement());
}
});
TableViewerColumn tableViewerColumnItem_Name = new TableViewerColumn(this.viewer, SWT.NONE);
TableColumn trclmnItemName = tableViewerColumnItem_Name.getColumn();
trclmnItemName.setWidth(200);
this.viewer.setContentProvider(new AdapterFactoryContentProvider(this.adapterFactory) {
@Override
public Object[] getElements(Object object) {
if (object instanceof SimpleToolList) {
return ((SimpleToolList) object).getSimpleTools().toArray();
}
return null;
}
});
this.viewer.setLabelProvider(new AdapterFactoryLabelProvider(this.adapterFactory));
// Buttons.
Composite composite = new Composite(this, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
composite.setLayout(new GridLayout(1, false));
this.btnNew = new Button(composite, SWT.NONE);
this.btnNew.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnNew.setSize(74, 29);
this.btnNew.setText("New");
this.btnNew.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
if (event.type == SWT.Selection) {
AbstractToolEClassSettings settings = ApogyAddonsUIFactory.eINSTANCE
.createAbstractToolEClassSettings();
settings.setName(ApogyCommonEMFFacade.INSTANCE.getDefaultName(getSimpleToolList(), null,
ApogyAddonsPackage.Literals.SIMPLE_TOOL_LIST__SIMPLE_TOOLS));
Wizard wizard = new ApogyEObjectWizard(ApogyAddonsPackage.Literals.SIMPLE_TOOL_LIST__SIMPLE_TOOLS,
getSimpleToolList(), settings, ApogyAddonsPackage.Literals.SIMPLE_TOOL);
WizardDialog dialog = new WizardDialog(getShell(), wizard);
dialog.open();
// Forces the viewer to refresh its input.
if (!SimpleToolListComposite.this.viewer.isBusy()) {
SimpleToolListComposite.this.viewer.setInput(getSimpleToolList());
}
}
}
});
Label label = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
label.setSize(64, 2);
this.btnDelete = new Button(composite, SWT.NONE);
this.btnDelete.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
String toolsToDeleteMessage = "";
Iterator<SimpleTool> projects = getSelectedSimpleTools().iterator();
while (projects.hasNext()) {
SimpleTool tool = projects.next();
toolsToDeleteMessage = toolsToDeleteMessage + tool.getName();
if (projects.hasNext()) {
toolsToDeleteMessage = toolsToDeleteMessage + ", ";
}
}
MessageDialog dialog = new MessageDialog(null, "Delete the selected tools", null,
"Are you sure to delete these tools: " + toolsToDeleteMessage, MessageDialog.QUESTION,
new String[] { "Yes", "No" }, 1);
int result = dialog.open();
if (result == 0) {
for (SimpleTool tool : getSelectedSimpleTools()) {
try {
ApogyAddonsFacade.INSTANCE.deleteTool(tool);
} catch (Exception e) {
Logger.error("Unable to delete the tool <" + tool.getName() + ">", e);
}
}
}
}
});
this.btnDelete.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnDelete.setSize(74, 29);
this.btnDelete.setText("Delete");
setSimpleToolList(ApogyAddonsFacade.INSTANCE.getSimpleToolList());
// Dispose
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (SimpleToolListComposite.this.m_bindingContext != null)
SimpleToolListComposite.this.m_bindingContext.dispose();
}
});
}
public SimpleToolList getSimpleToolList() {
return this.simpleToolList;
}
public void setSimpleToolList(SimpleToolList simpleToolList) {
if (this.simpleToolList != null) {
simpleToolList.eAdapters().remove(getAdapter());
}
this.simpleToolList = simpleToolList;
if (this.m_bindingContext != null) {
this.m_bindingContext.dispose();
}
if (simpleToolList != null) {
this.m_bindingContext = customInitDataBindings();
simpleToolList.eAdapters().add(getAdapter());
this.viewer.setInput(simpleToolList);
if (!this.viewer.isBusy()) {
Table table = this.viewer.getTable();
for (int i = 0; i < table.getColumnCount(); i++) {
table.getColumn(i).pack();
}
this.viewer.refresh();
}
} else {
// viewer.setInput(null);
}
}
@SuppressWarnings("unchecked")
public List<SimpleTool> getSelectedSimpleTools() {
return ((IStructuredSelection) this.viewer.getSelection()).toList();
}
/**
* This method is invoked a when a new selection is selected.
*/
protected void newSimpleToolSelected(SimpleTool simpleTool) {
}
protected DataBindingContext customInitDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
IObservableValue<?> observeSingleSelectionViewer = ViewerProperties.singleSelection().observe(this.viewer);
/* Delete Button Enabled Binding. */
IObservableValue<?> observeEnabledBtnDeleteObserveWidget = WidgetProperties.enabled().observe(this.btnDelete);
bindingContext.bindValue(observeEnabledBtnDeleteObserveWidget, observeSingleSelectionViewer, null,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE)
.setConverter(new Converter(Object.class, Boolean.class) {
@Override
public Object convert(Object fromObject) {
return fromObject != null;
}
}));
return bindingContext;
}
private Adapter getAdapter() {
if (this.adapter == null) {
this.adapter = new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
if (msg.getNotifier() instanceof SimpleToolList) {
// forces the viewer to update.
setSimpleToolList(getSimpleToolList());
}
}
};
}
return this.adapter;
}
}