/* * 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.tools; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.Charset; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.IOUtils; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Widget; import org.geotools.data.DataUtilities; import org.geotools.data.FeatureSource; import org.geotools.process.spatialstatistics.core.StringHelper; import org.geotools.process.spatialstatistics.styler.SSStyleBuilder; import org.geotools.styling.Style; import org.geotools.util.logging.Logging; import org.locationtech.udig.catalog.CatalogPlugin; import org.locationtech.udig.catalog.ICatalog; import org.locationtech.udig.catalog.IGeoResource; import org.locationtech.udig.catalog.IService; import org.locationtech.udig.processingtoolbox.ToolboxPlugin; import org.locationtech.udig.processingtoolbox.internal.ui.OutputDataWidget; import org.locationtech.udig.processingtoolbox.internal.ui.WidgetBuilder; import org.locationtech.udig.processingtoolbox.styler.MapUtils.FieldType; import org.locationtech.udig.processingtoolbox.styler.MapUtils.VectorLayerType; import org.locationtech.udig.project.ILayer; import org.locationtech.udig.project.IMap; import org.locationtech.udig.project.internal.Layer; import org.locationtech.udig.project.ui.ApplicationGIS; import org.locationtech.udig.style.sld.SLDContent; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; 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.Point; import com.vividsolutions.jts.geom.Polygon; /** * Abstract GeoProcessing Dialog * * @author Minpa Lee, MangoSystem * * @source $URL$ */ public abstract class AbstractGeoProcessingDialog extends TitleAreaDialog { protected static final Logger LOGGER = Logging.getLogger(AbstractGeoProcessingDialog.class); protected int increment = 10; // IRunnableWithProgress protected final String EMPTY = ""; //$NON-NLS-1$ protected final String DOT3 = "..."; //$NON-NLS-1$ protected String windowTitle = EMPTY; protected String windowDesc = EMPTY; protected org.eclipse.swt.graphics.Point windowSize = new org.eclipse.swt.graphics.Point(650, 400); protected OutputDataWidget locationView; protected String error; protected org.locationtech.udig.project.internal.Map map; protected WidgetBuilder uiBuilder = WidgetBuilder.newInstance(); public AbstractGeoProcessingDialog(Shell parentShell, IMap map) { super(parentShell); this.map = (org.locationtech.udig.project.internal.Map) map; } @Override public void create() { super.create(); setTitle(windowTitle); setMessage(windowDesc); } @Override protected org.eclipse.swt.graphics.Point getInitialSize() { return windowSize; } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(windowTitle); } @SuppressWarnings("nls") protected String saveErrorAsText() { OutputStream os = null; try { File folder = new File(System.getProperty("user.home")); File file = File.createTempFile("gxt_", ".txt", folder); os = new FileOutputStream(file); Writer writer = new OutputStreamWriter(os, Charset.defaultCharset()); writer.write(error); return file.getPath(); } catch (FileNotFoundException e) { LOGGER.log(Level.FINER, e.getMessage(), e); } catch (IOException e) { LOGGER.log(Level.FINER, e.getMessage(), e); } finally { IOUtils.closeQuietly(os); } return null; } protected boolean existCheckedItem(Table table) { for (TableItem item : table.getItems()) { if (item.getChecked()) { return true; } } return false; } protected boolean invalidWidgetValue(Widget... widgets) { for (Widget widget : widgets) { if (widget instanceof Combo && ((Combo) widget).getText().isEmpty()) { return true; } else if (widget instanceof Text && StringHelper.isNullOrEmpty(((Text) widget).getText())) { return true; } else if (widget instanceof Table && ((Table) widget).getItemCount() == 0) { return true; } } return false; } protected void openInformation(final Shell activeCell, Object msg) { MessageDialog.openInformation(activeCell, activeCell.getText(), msg.toString()); } protected void setEnabled(boolean enabled) { Button okButton = getButton(IDialogConstants.OK_ID); if (okButton != null) { okButton.setEnabled(enabled); } } protected void setComboItems(Combo combo, Class<?> enumClass) { for (Object enumVal : enumClass.getEnumConstants()) { combo.add(enumVal.toString()); } } protected void addFeaturesToMap(IMap map, String filePath, String layerName) { try { File shapefile = new File(filePath); if (!shapefile.exists()) { return; } CatalogPlugin catalogPlugin = CatalogPlugin.getDefault(); ICatalog localCatalog = catalogPlugin.getLocalCatalog(); URL resourceId = DataUtilities.fileToURL(shapefile); List<IService> services = catalogPlugin.getServiceFactory().createService(resourceId); for (IService service : services) { localCatalog.add(service); for (IGeoResource resource : service.resources(null)) { List<IGeoResource> resourceList = Collections.singletonList(resource); final int pos = map.getMapLayers().size(); Layer layer = (Layer) ApplicationGIS.addLayersToMap(map, resourceList, pos) .get(0); layer.setName(layerName); SSStyleBuilder ssBuilder = new SSStyleBuilder(layer.getSchema()); ssBuilder.setOpacity(0.8f); Style style = ssBuilder.getDefaultFeatureStyle(); if (style != null) { layer.getStyleBlackboard().put(SLDContent.ID, style); layer.getStyleBlackboard().setSelected(new String[] { SLDContent.ID }); } // refresh layer.refresh(layer.getBounds(new NullProgressMonitor(), null)); } } } catch (MalformedURLException e) { ToolboxPlugin.log(e.getMessage()); } catch (IOException e) { ToolboxPlugin.log(e.getMessage()); } } protected void fillLayers(IMap map, Combo combo, VectorLayerType layerType) { combo.removeAll(); for (ILayer layer : map.getMapLayers()) { if (layer.getName() != null && layer.hasResource(FeatureSource.class)) { GeometryDescriptor descriptor = layer.getSchema().getGeometryDescriptor(); Class<?> geometryBinding = descriptor.getType().getBinding(); switch (layerType) { case ALL: combo.add(layer.getName()); break; case LINESTRING: if (geometryBinding.isAssignableFrom(LineString.class) || geometryBinding.isAssignableFrom(MultiLineString.class)) { combo.add(layer.getName()); } break; case POINT: if (geometryBinding.isAssignableFrom(Point.class) || geometryBinding.isAssignableFrom(MultiPoint.class)) { combo.add(layer.getName()); } break; case POLYGON: if (geometryBinding.isAssignableFrom(Polygon.class) || geometryBinding.isAssignableFrom(MultiPolygon.class)) { combo.add(layer.getName()); } break; case MULTIPART: if (geometryBinding.isAssignableFrom(MultiPolygon.class) || geometryBinding.isAssignableFrom(MultiLineString.class) || geometryBinding.isAssignableFrom(MultiPoint.class)) { combo.add(layer.getName()); } break; case POLYLINE: if (geometryBinding.isAssignableFrom(Point.class) || geometryBinding.isAssignableFrom(MultiPoint.class) || geometryBinding.isAssignableFrom(Polygon.class) || geometryBinding.isAssignableFrom(MultiPolygon.class)) { combo.add(layer.getName()); } break; default: break; } } } } protected void fillEnum(Combo combo, Class<?> enumType) { combo.removeAll(); for (Object enumVal : enumType.getEnumConstants()) { combo.add(enumVal.toString()); } combo.select(0); } protected void fillFields(Combo combo, SimpleFeatureType schema, FieldType fieldType) { combo.removeAll(); for (AttributeDescriptor descriptor : schema.getAttributeDescriptors()) { if (descriptor instanceof GeometryDescriptor) { continue; } Class<?> binding = descriptor.getType().getBinding(); switch (fieldType) { case ALL: combo.add(descriptor.getLocalName()); break; case Double: if (Double.class.isAssignableFrom(binding) || Float.class.isAssignableFrom(binding)) { combo.add(descriptor.getLocalName()); } break; case Integer: if (Short.class.isAssignableFrom(binding) || Integer.class.isAssignableFrom(binding) || Long.class.isAssignableFrom(binding)) { combo.add(descriptor.getLocalName()); } break; case Number: if (Number.class.isAssignableFrom(binding)) { combo.add(descriptor.getLocalName()); } break; case String: if (String.class.isAssignableFrom(binding)) { combo.add(descriptor.getLocalName()); } break; } } } }