X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=gis%2Fplugins%2Forg.argeo.gis.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fgis%2Fui%2Fcommands%2FAddFeatureSources.java;fp=gis%2Fplugins%2Forg.argeo.gis.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fgis%2Fui%2Fcommands%2FAddFeatureSources.java;h=aeb962a8058ad891deb55acb9bcd8d7452c6f38a;hb=477f38e7085ce32c6f09e062cac90f7ba8769698;hp=0000000000000000000000000000000000000000;hpb=5a00c032d8c7b9617777db83b0a6d60ab6b74d18;p=lgpl%2Fargeo-commons.git diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/AddFeatureSources.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/AddFeatureSources.java new file mode 100644 index 000000000..aeb962a80 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/AddFeatureSources.java @@ -0,0 +1,181 @@ +package org.argeo.gis.ui.commands; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.AbstractTreeContentProvider; +import org.argeo.eclipse.ui.TreeParent; +import org.argeo.geotools.jcr.GeoJcrMapper; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.handlers.HandlerUtil; +import org.geotools.data.FeatureSource; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; + +public class AddFeatureSources extends AbstractHandler { + private GeoJcrMapper geoJcrMapper; + + public Object execute(ExecutionEvent event) throws ExecutionException { + try { + FeatureSourceChooserDialog dialog = new FeatureSourceChooserDialog( + HandlerUtil.getActiveShell(event)); + if (dialog.open() == Dialog.OK) { + Map>> featureSources = dialog + .getFeatureSources(); + for (String alias : featureSources.keySet()) { + for (FeatureSource fs : featureSources + .get(alias)) { + Node fsNode = geoJcrMapper.getNode(alias, fs); + try { + fsNode.getSession().save(); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot save " + fsNode, e); + } + } + } + } + return null; + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + } + + public void setGeoJcrMapper(GeoJcrMapper geoJcrMapper) { + this.geoJcrMapper = geoJcrMapper; + } + + class FeatureSourceChooserDialog extends TitleAreaDialog { + private TreeViewer viewer; + private Map>> featureSources = new HashMap>>(); + + public FeatureSourceChooserDialog(Shell parentShell) { + super(parentShell); + } + + protected Point getInitialSize() { + return new Point(300, 400); + } + + protected Control createDialogArea(Composite parent) { + setTitle("Feature Source"); + setMessage("Select or or many feature sources to register"); + Composite dialogarea = (Composite) super.createDialogArea(parent); + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayout(new GridLayout(1, false)); + composite + .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + viewer = new TreeViewer(composite); + viewer.getTree().setLayoutData( + new GridData(SWT.FILL, SWT.FILL, true, true)); + viewer.setContentProvider(new DataStoreContentProvider()); + viewer.setLabelProvider(new DataStoreLabelProvider()); + viewer.setInput(geoJcrMapper.getPossibleFeatureSources()); + parent.pack(); + return composite; + } + + @SuppressWarnings("unchecked") + @Override + protected void okPressed() { + Iterator it = ((IStructuredSelection) viewer.getSelection()) + .iterator(); + while (it.hasNext()) { + Object obj = it.next(); + if (obj instanceof FeatureSourceNode) { + FeatureSourceNode fsn = (FeatureSourceNode) obj; + String alias = fsn.getDataStoreAlias(); + if (!featureSources.containsKey(alias)) + featureSources + .put(alias, + new ArrayList>()); + featureSources.get(alias).add(fsn.getFeatureSource()); + } else { + // data store node + String alias = obj.toString(); + featureSources.put(alias, geoJcrMapper + .getPossibleFeatureSources().get(alias)); + } + } + super.okPressed(); + } + + public Map>> getFeatureSources() { + return featureSources; + } + } + + private class DataStoreContentProvider extends AbstractTreeContentProvider { + + @SuppressWarnings("unchecked") + public Object[] getElements(Object inputElement) { + List dataStoreNodes = new ArrayList(); + Map>> featureSources = (Map>>) inputElement; + for (String alias : featureSources.keySet()) { + TreeParent dataStoreNode = new TreeParent(alias); + for (FeatureSource featureSource : featureSources + .get(alias)) { + dataStoreNode.addChild(new FeatureSourceNode(alias, + featureSource)); + } + dataStoreNodes.add(dataStoreNode); + } + return dataStoreNodes.toArray(); + } + + } + + private class DataStoreLabelProvider extends LabelProvider { + + @Override + public String getText(Object element) { + return super.getText(element); + } + + } + + private class FeatureSourceNode extends TreeParent { + private final String dataStoreAlias; + private final FeatureSource featureSource; + + public FeatureSourceNode(String dataStoreAlias, + FeatureSource featureSource) { + super(featureSource.getName().toString()); + this.dataStoreAlias = dataStoreAlias; + this.featureSource = featureSource; + } + + public String getDataStoreAlias() { + return dataStoreAlias; + } + + public FeatureSource getFeatureSource() { + return featureSource; + } + + } + +}