/*
* uDig - User Friendly Desktop Internet GIS client
* (C) MangoSystem - www.mangosystem.com
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html), and the Refractions BSD
* License v1.0 (http://udig.refractions.net/files/bsd3-v10.html).
*/
package org.locationtech.udig.processingtoolbox.internal.ui;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Widget;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.data.FeatureSource;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.util.logging.Logging;
import org.locationtech.udig.processingtoolbox.ToolboxPlugin;
import org.locationtech.udig.processingtoolbox.internal.Messages;
import org.locationtech.udig.processingtoolbox.styler.MapUtils;
import org.locationtech.udig.processingtoolbox.styler.MapUtils.VectorLayerType;
import org.locationtech.udig.project.ILayer;
import org.locationtech.udig.project.IMap;
import org.opengis.coverage.grid.GridCoverageReader;
import org.opengis.feature.type.GeometryDescriptor;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Polygon;
/**
* Multiple Fields Selection Dialog
*
* @author Minpa Lee, MangoSystem
*
* @source $URL$
*/
public class MultipleLayersSelectionDialog extends Dialog {
protected static final Logger LOGGER = Logging.getLogger(MultipleLayersSelectionDialog.class);
static final String[] columns = new String[] { Messages.Feature_Name, Messages.Feature_Type,
Messages.Feature_CRS };
private IMap map = null;
private Table schemaTable;
private boolean isFeatures = true;
private Button btnVector, btnPoint, btnLine, btnPolygon, btnRaster;
private List<SimpleFeatureCollection> vectors = new ArrayList<SimpleFeatureCollection>();
private List<GridCoverage2D> rasters = new ArrayList<GridCoverage2D>();
public MultipleLayersSelectionDialog(Shell parentShell, IMap map, boolean isFeatures) {
super(parentShell);
this.map = map;
this.isFeatures = isFeatures;
setShellStyle(SWT.CLOSE | SWT.MIN | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL
| SWT.RESIZE);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.MultipleLayersSelectionDialog_title);
}
public List<SimpleFeatureCollection> getSelectedFeatures() {
return vectors.size() == 0 ? null : vectors;
}
public List<GridCoverage2D> getSelectedRasters() {
return rasters.size() == 0 ? null : rasters;
}
@Override
protected Point getInitialSize() {
return ToolboxPlugin.rescaleSize(getShell(), 500, 450);
}
/**
* Create contents of the dialog.
*
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
GridLayout layout = new GridLayout(1, false);
layout.marginWidth = layout.marginHeight = layout.marginRight = layout.marginBottom = 2;
area.setLayout(layout);
Composite container = new Composite(area, SWT.NONE);
container.setLayout(new GridLayout(1, false));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
WidgetBuilder widget = WidgetBuilder.newInstance();
// 1. FeatureType's Schema
Group grpLayer = widget.createGroup(container, null, false, 5, 0, 5);
btnVector = widget.createRadioButton(grpLayer, Messages.Feature_Vector, null, 1);
btnPoint = widget.createRadioButton(grpLayer, Messages.Feature_Point, null, 1);
btnLine = widget.createRadioButton(grpLayer, Messages.Feature_LineString, null, 1);
btnPolygon = widget.createRadioButton(grpLayer, Messages.Feature_Polygon, null, 1);
btnRaster = widget.createRadioButton(grpLayer, Messages.Raster, null, 1);
btnVector.addSelectionListener(selectionListener);
btnPoint.addSelectionListener(selectionListener);
btnLine.addSelectionListener(selectionListener);
btnPolygon.addSelectionListener(selectionListener);
btnRaster.addSelectionListener(selectionListener);
btnVector.setEnabled(isFeatures);
btnPoint.setEnabled(isFeatures);
btnLine.setEnabled(isFeatures);
btnPolygon.setEnabled(isFeatures);
btnRaster.setEnabled(!isFeatures);
schemaTable = widget.createTable(grpLayer, columns, 5);
schemaTable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if (isFeatures) {
vectors.clear();
for (TableItem item : schemaTable.getItems()) {
if (item.getChecked()) {
vectors.add(MapUtils.getFeatures((ILayer) item.getData()));
}
}
} else {
rasters.clear();
for (TableItem item : schemaTable.getItems()) {
if (item.getChecked()) {
rasters.add(MapUtils.getGridCoverage((ILayer) item.getData()));
}
}
}
}
});
TableSelectionWidget tblSelection = new TableSelectionWidget(schemaTable);
tblSelection.create(grpLayer, SWT.NONE, 5, 1);
area.pack();
if (isFeatures) {
btnVector.setSelection(true);
loadVectorLayers(VectorLayerType.ALL);
} else {
btnRaster.setSelection(true);
loadRasterLayers();
}
return area;
}
SelectionListener selectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
Widget widget = event.widget;
if (widget.equals(btnPoint) && btnPoint.getSelection()) {
loadVectorLayers(VectorLayerType.POINT);
} else if (widget.equals(btnLine) && btnLine.getSelection()) {
loadVectorLayers(VectorLayerType.LINESTRING);
} else if (widget.equals(btnPolygon) && btnPolygon.getSelection()) {
loadVectorLayers(VectorLayerType.POLYGON);
} else if (widget.equals(btnVector) && btnVector.getSelection()) {
loadVectorLayers(VectorLayerType.ALL);
} else if (widget.equals(btnRaster) && btnRaster.getSelection()) {
loadRasterLayers();
}
}
};
private void loadRasterLayers() {
schemaTable.removeAll();
for (ILayer layer : map.getMapLayers()) {
if (layer.getName() != null
&& (layer.hasResource(GridCoverage2D.class) || layer.getGeoResource()
.canResolve(GridCoverageReader.class))) {
String crs = layer.getCRS().toWKT();
TableItem item = new TableItem(schemaTable, SWT.NONE);
item.setText(new String[] { layer.getName(), Messages.Raster, crs });
item.setData(layer);
}
}
}
private void loadVectorLayers(VectorLayerType layerType) {
schemaTable.removeAll();
for (ILayer layer : map.getMapLayers()) {
if (layer.getName() != null && layer.hasResource(FeatureSource.class)) {
GeometryDescriptor descriptor = layer.getSchema().getGeometryDescriptor();
Class<?> geometryBinding = descriptor.getType().getBinding();
String crs = descriptor.getCoordinateReferenceSystem().toWKT();
switch (layerType) {
case ALL:
insertTableItem(layer, geometryBinding.getSimpleName(), crs);
break;
case LINESTRING:
if (geometryBinding.isAssignableFrom(LineString.class)
|| geometryBinding.isAssignableFrom(MultiLineString.class)) {
insertTableItem(layer, geometryBinding.getSimpleName(), crs);
}
break;
case POINT:
if (geometryBinding.isAssignableFrom(com.vividsolutions.jts.geom.Point.class)
|| geometryBinding.isAssignableFrom(MultiPoint.class)) {
insertTableItem(layer, geometryBinding.getSimpleName(), crs);
}
break;
case POLYGON:
if (geometryBinding.isAssignableFrom(Polygon.class)
|| geometryBinding.isAssignableFrom(MultiPolygon.class)) {
insertTableItem(layer, geometryBinding.getSimpleName(), crs);
}
break;
case MULTIPART:
if (geometryBinding.isAssignableFrom(MultiPolygon.class)
|| geometryBinding.isAssignableFrom(MultiLineString.class)
|| geometryBinding.isAssignableFrom(MultiPoint.class)) {
insertTableItem(layer, geometryBinding.getSimpleName(), crs);
}
break;
case POLYLINE:
if (geometryBinding.isAssignableFrom(Point.class)
|| geometryBinding.isAssignableFrom(MultiPoint.class)
|| geometryBinding.isAssignableFrom(Polygon.class)
|| geometryBinding.isAssignableFrom(MultiPolygon.class)) {
insertTableItem(layer, geometryBinding.getSimpleName(), crs);
}
break;
default:
break;
}
}
}
}
private void insertTableItem(ILayer layer, String layerType, String crs) {
TableItem item = new TableItem(schemaTable, SWT.NONE);
item.setText(new String[] { layer.getName(), layerType, crs });
item.setData(layer);
}
}