/*
* Copyright (c) 2015 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.io.project.update;
import java.util.List;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
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.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import eu.esdihumboldt.hale.common.core.io.ImportProvider;
import eu.esdihumboldt.hale.common.core.io.extension.IOProviderExtension;
import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration;
import eu.esdihumboldt.hale.common.schema.SchemaSpaceID;
import eu.esdihumboldt.hale.ui.HaleUI;
import eu.esdihumboldt.hale.ui.io.schema.SchemaImportAdvisor;
import eu.esdihumboldt.hale.ui.io.schema.SchemaImportWizard;
import eu.esdihumboldt.hale.ui.util.wizard.HaleWizardDialog;
/**
* Component that allows updating a schema location / configuration.
*
* @author Simon Templer
*/
public class SchemaUpdateComponent extends Composite {
private Button updateButton;
private TableViewer tableViewer;
private String actionId;
private List<IOConfiguration> configurations;
/**
* Constructor.
*
* @param parent the parent composite
* @param actionId the action ID
* @param configurations the list of configurations (the component may make
* changes to this list)
*/
public SchemaUpdateComponent(Composite parent, final String actionId,
final List<IOConfiguration> configurations) {
super(parent, SWT.NONE);
this.actionId = actionId;
this.configurations = configurations;
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(this);
// intro label
Label intro = new Label(this, SWT.WRAP);
intro.setText("Please select a schema from the list to update/replace it:");
GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(intro);
// viewer with schema list
Composite tableContainer = new Composite(this, SWT.NONE);
tableContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
TableColumnLayout layout = new TableColumnLayout();
tableContainer.setLayout(layout);
tableViewer = new TableViewer(tableContainer, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
tableViewer.getTable().setLinesVisible(true);
tableViewer.getTable().setHeaderVisible(true);
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
tableViewer.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IOConfiguration) {
return actionId.equals(((IOConfiguration) element).getActionId());
}
return false;
}
});
TableViewerColumn typeColumn = new TableViewerColumn(tableViewer, SWT.NONE);
layout.setColumnData(typeColumn.getColumn(), new ColumnWeightData(1));
typeColumn.getColumn().setText("Type");
typeColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IOConfiguration config = (IOConfiguration) element;
return IOProviderExtension.getInstance().getFactory(config.getProviderId())
.getDisplayName();
}
});
TableViewerColumn locationColumn = new TableViewerColumn(tableViewer, SWT.NONE);
layout.setColumnData(locationColumn.getColumn(), new ColumnWeightData(3));
locationColumn.getColumn().setText("Location");
locationColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IOConfiguration config = (IOConfiguration) element;
return config.getProviderConfiguration().get(ImportProvider.PARAM_SOURCE)
.toString();
}
});
tableViewer.setInput(configurations);
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateState();
}
});
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
updateSelectedSchema();
}
});
// update button
updateButton = new Button(this, SWT.PUSH);
GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(updateButton);
updateButton.setText("Update");
updateButton.setToolTipText("Update/replace the selected schema");
updateButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateSelectedSchema();
}
});
// initial state update
updateState();
}
/**
*
*/
protected void updateSelectedSchema() {
ISelection sel = tableViewer.getSelection();
if (!sel.isEmpty() && sel instanceof IStructuredSelection) {
final IOConfiguration selected = (IOConfiguration) ((IStructuredSelection) sel)
.getFirstElement();
SchemaImportWizard wizard = new SchemaImportWizard() {
@Override
public boolean performFinish() {
if (!applyConfiguration()) {
return false;
}
IOConfiguration configuration = new IOConfiguration();
configuration.setActionId(getActionId());
configuration.setProviderId(getProviderFactory().getIdentifier());
getProvider().storeConfiguration(configuration.getProviderConfiguration());
// replace the previously selected I/O configuration
int index = configurations.indexOf(selected);
configurations.set(index, configuration);
// refresh table viewer to reflect the changes
tableViewer.refresh(true);
return true;
}
};
// configure advisor
// FIXME
SchemaImportAdvisor advisor = new SchemaImportAdvisor(SchemaSpaceID.TARGET);
advisor.setServiceProvider(HaleUI.getServiceProvider());
wizard.setAdvisor(advisor, actionId);
// open wizard
Shell shell = Display.getCurrent().getActiveShell();
HaleWizardDialog dialog = new HaleWizardDialog(shell, wizard);
dialog.open();
}
}
/**
* Update the component state.
*/
private void updateState() {
boolean selected = !tableViewer.getSelection().isEmpty();
updateButton.setEnabled(selected);
}
}