blob: 039da6b14647a15cbc6daa384f639cb3c2bfe3f3 [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:
* Regent L'Archeveque - initial API and implementation
*
* SPDX-License-Identifier: EPL-1.0
*******************************************************************************/
package org.eclipse.apogy.workspace.ui.composites;
import java.util.Iterator;
import java.util.List;
import org.eclipse.apogy.workspace.ApogyWorkspaceFacade;
import org.eclipse.apogy.workspace.ui.wizards.ImportProjectWizard;
import org.eclipse.apogy.workspace.ui.wizards.NewProjectWizard;
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.core.resources.IProject;
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.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.wizard.IWizard;
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.events.SelectionListener;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WorkspaceProjectsListComposite extends Composite {
private static final Logger Logger = LoggerFactory.getLogger(WorkspaceProjectsListComposite.class);
private DataBindingContext m_bindingContext;
private TableViewer viewer;
private Button btnOpen;
private Button btnDelete;
private Button btnImport;
private Button btnExport;
private Adapter workspaceAdapter;
public WorkspaceProjectsListComposite(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout(2, false));
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
ApogyWorkspaceFacade.INSTANCE.eAdapters().remove(getWorkspaceAdapter());
if (WorkspaceProjectsListComposite.this.m_bindingContext != null) {
WorkspaceProjectsListComposite.this.m_bindingContext.dispose();
}
}
});
this.viewer = new TableViewer(this, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
Table table = this.viewer.getTable();
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2));
table.setLinesVisible(true);
ColumnViewerToolTipSupport.enableFor(this.viewer);
this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
newSelection(event.getSelection());
}
});
TableViewerColumn tableViewerColumnItem_Name = new TableViewerColumn(this.viewer, SWT.NONE);
TableColumn trclmnItemName = tableViewerColumnItem_Name.getColumn();
trclmnItemName.setWidth(200);
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.btnOpen = new Button(composite, SWT.NONE);
this.btnOpen.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
try {
ApogyWorkspaceFacade.INSTANCE.openApogyProject(getSelectedProjects().get(0));
} catch (Exception e) {
Logger.error("Unable to open project <" + getSelectedProjects().get(0).getName() + ">", e);
}
}
});
this.btnOpen.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnOpen.setText("Open");
Label label = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
label.setSize(64, 2);
Button btnNew = new Button(composite, SWT.NONE);
btnNew.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
new WizardDialog(parent.getShell(), new NewProjectWizard()).open();
}
});
btnNew.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
btnNew.setSize(74, 29);
btnNew.setText("New");
this.btnDelete = new Button(composite, SWT.NONE);
this.btnDelete.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
String projectToDeleteMessage = "";
Iterator<IProject> projects = getSelectedProjects().iterator();
while (projects.hasNext()) {
IProject project = projects.next();
projectToDeleteMessage = projectToDeleteMessage + project.getName();
if (projects.hasNext()) {
projectToDeleteMessage = projectToDeleteMessage + ", ";
}
}
MessageDialog dialog = new MessageDialog(null, "Delete the selected project", null,
"Are you sure to delete these projects: " + projectToDeleteMessage, MessageDialog.QUESTION,
new String[] { "Yes", "No" }, 1);
int result = dialog.open();
if (result == 0) {
for (IProject project : getSelectedProjects()) {
try {
ApogyWorkspaceFacade.INSTANCE.deleteApogyProject(project);
} catch (Exception e) {
Logger.error("Unable to delete the project <"
+ ApogyWorkspaceFacade.INSTANCE.getActiveProject().getName() + ">", e);
}
}
}
}
});
this.btnDelete.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnDelete.setSize(74, 29);
this.btnDelete.setText("Delete");
Composite composite_1 = new Composite(this, SWT.NONE);
composite_1.setLayout(new GridLayout(1, false));
composite_1.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1));
this.btnImport = new Button(composite_1, SWT.NONE);
this.btnImport.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnImport.setText("Import Session");
this.btnImport.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
IWizard wizard = new ImportProjectWizard();
new WizardDialog(parent.getShell(), wizard).open();
} catch (Exception e) {
Logger.error("Unable to import the selected session", e);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
this.btnExport = new Button(composite_1, SWT.NONE);
this.btnExport.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnExport.setSize(74, 29);
this.btnExport.setText("Export");
this.btnExport.setEnabled(false);
this.viewer.setContentProvider(ArrayContentProvider.getInstance());
this.viewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
IProject project = ((IProject) element);
String result = project.getName();
if (project == ApogyWorkspaceFacade.INSTANCE.getActiveProject()) {
result = "<Active> " + result;
}
return result;
}
});
this.m_bindingContext = customInitDataBindings();
this.viewer.setInput(ApogyWorkspaceFacade.INSTANCE.getWorkspaceApogyProjects().toArray());
// Dispose
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (WorkspaceProjectsListComposite.this.m_bindingContext != null)
WorkspaceProjectsListComposite.this.m_bindingContext.dispose();
}
});
}
/**
* This method is invoked a when a new selection is selected.
*/
protected void newSelection(ISelection selection) {
}
/**
* Returns the selected {@link IProject}.
*
* @return Reference to the project or null if no project is selected.
*/
@SuppressWarnings("unchecked")
public List<IProject> getSelectedProjects() {
return ((IStructuredSelection) this.viewer.getSelection()).toList();
}
protected DataBindingContext customInitDataBindings() {
ApogyWorkspaceFacade.INSTANCE.eAdapters().remove(getWorkspaceAdapter());
DataBindingContext bindingContext = new DataBindingContext();
IObservableValue<?> observeSingleSelectionViewer = ViewerProperties.singleSelection().observe(this.viewer);
/* Open Button Enabled Binding. */
IObservableValue<?> observeEnabledBtnOpenObserveWidget = WidgetProperties.enabled().observe(this.btnOpen);
bindingContext.bindValue(observeEnabledBtnOpenObserveWidget, observeSingleSelectionViewer, null,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE)
.setConverter(new Converter(Object.class, Boolean.class) {
@Override
public Object convert(Object fromObject) {
return fromObject != null;
}
}));
/* 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;
}
}));
/* Export Button Enabled Binding. */
IObservableValue<?> observeEnabledBtnExportObserveWidget = WidgetProperties.enabled().observe(this.btnExport);
bindingContext.bindValue(observeEnabledBtnExportObserveWidget, observeSingleSelectionViewer, null,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE)
.setConverter(new Converter(IProject.class, Boolean.class) {
@Override
public Object convert(Object fromObject) {
return fromObject != null;
}
}));
ApogyWorkspaceFacade.INSTANCE.eAdapters().add(getWorkspaceAdapter());
//
return bindingContext;
}
private Adapter getWorkspaceAdapter() {
if (this.workspaceAdapter == null) {
this.workspaceAdapter = new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
if (!isDisposed()) {
WorkspaceProjectsListComposite.this.viewer
.setInput(ApogyWorkspaceFacade.INSTANCE.getWorkspaceApogyProjects().toArray());
}
}
};
}
return this.workspaceAdapter;
}
}