/*
* Copyright (c) 2013 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.config;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.geotools.gml2.SrsSyntax;
import org.geotools.referencing.CRS;
import eu.esdihumboldt.hale.common.core.io.IOProvider;
import eu.esdihumboldt.hale.common.instance.io.GeoInstanceWriter;
import eu.esdihumboldt.hale.common.instance.io.util.EnumWindingOrderTypes;
import eu.esdihumboldt.hale.common.schema.geometry.CRSDefinition;
import eu.esdihumboldt.hale.ui.io.IOWizard;
import eu.esdihumboldt.hale.ui.io.instance.crs.SelectCRSDialog;
import eu.esdihumboldt.hale.ui.util.viewer.EnumContentProvider;
/**
* Configuration page for the character encoding.
*
* @param <W> the concrete I/O wizard type
* @param
* <P>
* the {@link IOProvider} type used in the wizard
*
* @author Simon Templer
*/
public class TargetCRSConfigurationPage<P extends GeoInstanceWriter, W extends IOWizard<P>>
extends AbstractConfigurationPage<P, W> {
private Label crsLabel;
private Button checkConvert;
private Button selectCrs;
private CRSDefinition crsDef;
private Button checkPrefix;
private ComboViewer prefixCombo;
private ComboViewer windingorderCombo;
/**
* Default constructor.
*/
public TargetCRSConfigurationPage() {
super("targetCRS");
setTitle("Coordinate reference system");
setDescription("Configure the target coordinate reference system and winding order");
setPageComplete(false);
}
@Override
public void enable() {
// nothing to do
}
@Override
public void disable() {
// nothing to do
}
@Override
protected void onShowPage(boolean firstShow) {
super.onShowPage(firstShow);
if (firstShow) {
// init from provider
crsDef = getWizard().getProvider().getTargetCRS();
checkConvert.setSelection(crsDef != null);
String prefix = getWizard().getProvider().getCustomEPSGPrefix();
SrsSyntax prefixValue = null;
if (prefix != null) {
try {
for (SrsSyntax srsSyntax : SrsSyntax.values()) {
if (srsSyntax.getPrefix().equals(prefix)) {
prefixValue = srsSyntax;
break;
}
}
} catch (Exception e) {
// ignore
}
}
if (prefixValue != null) {
prefixCombo.setSelection(new StructuredSelection(prefixValue));
}
checkPrefix.setSelection(prefixValue != null);
EnumWindingOrderTypes windingorder = getWizard().getProvider().getWindingOrder();
if (windingorder != null) {
windingorderCombo.setSelection(new StructuredSelection(windingorder));
}
update();
}
}
@Override
public boolean updateConfiguration(GeoInstanceWriter provider) {
if (checkConvert.getSelection()) {
provider.setTargetCRS(crsDef);
}
else {
provider.setTargetCRS(null);
}
String prefix = null;
if (checkPrefix.getSelection()) {
ISelection sel = prefixCombo.getSelection();
if (!sel.isEmpty() && sel instanceof IStructuredSelection) {
Object selected = ((IStructuredSelection) prefixCombo.getSelection())
.getFirstElement();
if (selected instanceof SrsSyntax) {
prefix = ((SrsSyntax) selected).getPrefix();
}
}
}
provider.setCustomEPSGPrefix(prefix);
EnumWindingOrderTypes windingorder = null;
ISelection order = windingorderCombo.getSelection();
if (!order.isEmpty() && order instanceof IStructuredSelection) {
Object selected = ((IStructuredSelection) windingorderCombo.getSelection())
.getFirstElement();
if (selected instanceof EnumWindingOrderTypes) {
windingorder = (EnumWindingOrderTypes) selected;
}
}
provider.setWindingOrder(windingorder);
return true;
}
@Override
protected void createContent(Composite page) {
GridLayoutFactory.swtDefaults().numColumns(1).applyTo(page);
Group convertGroup = new Group(page, SWT.NONE);
convertGroup.setText("Convert to CRS");
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(convertGroup);
GridDataFactory.fillDefaults().grab(true, false).applyTo(convertGroup);
checkConvert = new Button(convertGroup, SWT.CHECK);
checkConvert.setText("Convert all geometries to the given target CRS:");
GridDataFactory.swtDefaults().span(2, 1).applyTo(checkConvert);
checkConvert.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
});
crsLabel = new Label(convertGroup, SWT.NONE);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false)
.applyTo(crsLabel);
selectCrs = new Button(convertGroup, SWT.PUSH);
selectCrs.setText("Select...");
GridDataFactory.swtDefaults().applyTo(selectCrs);
selectCrs.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
SelectCRSDialog dlg = new SelectCRSDialog(e.display.getActiveShell(), crsDef);
if (dlg.open() == Dialog.OK) {
crsDef = dlg.getValue();
}
update();
}
});
Group prefixGroup = new Group(page, SWT.NONE);
prefixGroup.setText("EPSG prefix");
GridLayoutFactory.swtDefaults().numColumns(1).applyTo(prefixGroup);
GridDataFactory.fillDefaults().grab(true, false).applyTo(prefixGroup);
checkPrefix = new Button(prefixGroup, SWT.CHECK);
checkPrefix.setText("Use a specific EPSG prefix for SRS names");
GridDataFactory.swtDefaults().applyTo(checkConvert);
checkPrefix.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
});
prefixCombo = new ComboViewer(prefixGroup);
GridDataFactory.fillDefaults().grab(true, false).applyTo(prefixCombo.getControl());
prefixCombo.setContentProvider(EnumContentProvider.getInstance());
prefixCombo.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof SrsSyntax) {
return ((SrsSyntax) element).getPrefix();
}
return super.getText(element);
}
});
prefixCombo.setInput(SrsSyntax.class);
prefixCombo.setSelection(new StructuredSelection(SrsSyntax.OGC_HTTP_URI));
// Winding Order
Group windingOrderGroup = new Group(page, SWT.NONE);
windingOrderGroup.setText("Unify winding order");
GridLayoutFactory.swtDefaults().numColumns(1).applyTo(windingOrderGroup);
GridDataFactory.fillDefaults().grab(true, false).applyTo(windingOrderGroup);
windingorderCombo = new ComboViewer(windingOrderGroup);
GridDataFactory.fillDefaults().grab(true, false).applyTo(windingorderCombo.getControl());
windingorderCombo.setContentProvider(EnumContentProvider.getInstance());
windingorderCombo.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof EnumWindingOrderTypes) {
return ((EnumWindingOrderTypes) element).getWindingOrder();
}
return super.getText(element);
}
});
windingorderCombo.setInput(EnumWindingOrderTypes.class);
// only update on first show
// update();
}
/**
* Update the page state.
*/
private void update() {
// update the CRS label
if (crsDef == null || crsDef.getCRS() == null) {
crsLabel.setText("<None selected>");
}
else {
String name = crsDef.getCRS().getName().toString();
name = name.replaceAll("EPSG:", "");
name += " (" + CRS.toSRS(crsDef.getCRS()) + ")";
crsLabel.setText(name);
}
// button status
selectCrs.setEnabled(checkConvert.getSelection());
crsLabel.setEnabled(checkConvert.getSelection());
prefixCombo.getControl().setEnabled(checkPrefix.getSelection());
// page status
if (checkConvert.getSelection()) {
if (crsDef == null) {
setPageComplete(false);
setMessage("Specify a valid target CRS to convert to", DialogPage.ERROR);
}
else {
setPageComplete(true);
setMessage(null);
}
}
else {
setPageComplete(true);
setMessage(null);
}
}
}