/*
* Copyright (c) 2012 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:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.io;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.viewers.ArrayContentProvider;
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.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import eu.esdihumboldt.hale.common.core.io.ExportProvider;
import eu.esdihumboldt.hale.common.core.io.IOProvider;
import eu.esdihumboldt.hale.common.core.io.Value;
import eu.esdihumboldt.hale.common.core.io.extension.IOProviderDescriptor;
import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration;
import eu.esdihumboldt.hale.ui.HaleWizardPage;
/**
* Wizard page that allows selecting an I/O provider
*
* @param <W> the concrete I/O wizard type
* @param <P> the {@link IOProvider} type used in the wizard
*
* @author Simon Templer
* @partner 01 / Fraunhofer Institute for Computer Graphics Research
* @since 2.5
*/
public class ExportSelectProviderPage<P extends ExportProvider, W extends ExportWizard<P>> extends
IOWizardPage<P, W> {
private ListViewer providers;
private Collection<IOProviderDescriptor> factories;
/**
* Default constructor
*/
public ExportSelectProviderPage() {
super("export.selProvider");
setTitle("Export format");
setDescription("Please select a format to export to");
}
/**
* @see HaleWizardPage#createContent(Composite)
*/
@Override
protected void createContent(Composite page) {
page.setLayout(new GridLayout(1, false));
// create provider list viewer
providers = new ListViewer(page, SWT.BORDER);
providers.getControl().setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
providers.setContentProvider(ArrayContentProvider.getInstance());
providers.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof IOProviderDescriptor) {
return ((IOProviderDescriptor) element).getDisplayName();
}
return "Custom configuration: " + super.getText(element);
}
});
factories = getWizard().getFactories();
List<Object> input = new ArrayList<>();
// check for presets
Collection<String> presets = getWizard().getPresets();
if (presets != null && !presets.isEmpty()) {
input.addAll(presets);
}
input.addAll(factories);
providers.setInput(input);
providers.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
if (canFlipToNextPage()) {
getContainer().showPage(getNextPage());
return;
}
}
});
// set initial selection
// if (!factories.isEmpty()) {
// providers.setSelection(new StructuredSelection(factories.iterator().next()), true);
// }
// process current selection
ISelection selection = providers.getSelection();
setPageComplete(!selection.isEmpty());
updateWizard(selection);
// process selection changes
providers.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
setPageComplete(!selection.isEmpty());
updateWizard(selection);
}
});
}
/**
* Update the wizard
*
* @param selection the current selection
*/
private void updateWizard(ISelection selection) {
setErrorMessage(null);
if (selection.isEmpty()) {
providerFactoryChanged(null);
setMessage(null);
}
else if (selection instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) selection;
Object element = sel.getFirstElement();
if (element instanceof IOProviderDescriptor) {
IOProviderDescriptor desc = (IOProviderDescriptor) element;
String descrText = desc.getDescription();
if (descrText != null) {
setMessage(descrText, INFORMATION);
}
else {
setMessage(null);
}
providerFactoryChanged(desc);
}
else {
if (getWizard().setPreset(element.toString())) {
String msg = null;
// try to get preset description
IOConfiguration conf = getWizard().getProjectService().getExportConfiguration(
element.toString());
if (conf != null) {
Value val = conf.getProviderConfiguration().get(
ExportConfigurations.PARAM_CONFIGURATION_DESCRIPTION);
if (val != null) {
String descr = val.as(String.class);
if (descr != null && !descr.isEmpty()) {
msg = descr;
}
}
}
if (msg == null) {
msg = MessageFormat.format("Use custom export configuration ''{0}''",
element);
}
setMessage(msg, INFORMATION);
}
else {
setMessage(null);
setErrorMessage("Invalid preset");
}
}
}
}
/**
* Called when the provider factory has been initialized or changed
*
* @param providerFactory the provider factory
*/
protected void providerFactoryChanged(IOProviderDescriptor providerFactory) {
getWizard().setProviderFactory(providerFactory);
}
/**
* @see IOWizardPage#updateConfiguration(IOProvider)
*/
@Override
public boolean updateConfiguration(P provider) {
return true;
}
@Override
public void loadPreSelection(IOConfiguration conf) {
for (IOProviderDescriptor desc : factories) {
if (desc.getIdentifier().equals(conf.getProviderId()))
providers.setSelection(new StructuredSelection(desc), true);
}
}
}