/* * Copyright (c) 2016 Fraunhofer IGD * * 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: * Fraunhofer IGD <http://www.igd.fraunhofer.de/> */ package de.fhg.igd.mapviewer.server.wms.wizard.pages; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; 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.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.Combo; import org.eclipse.swt.widgets.Composite; import org.geotools.referencing.CRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; import de.fhg.igd.mapviewer.server.wms.Messages; import de.fhg.igd.mapviewer.server.wms.WMSConfiguration; import de.fhg.igd.mapviewer.server.wms.capabilities.WMSCapabilities; import de.fhg.igd.mapviewer.server.wms.capabilities.WMSCapabilitiesException; import de.fhg.igd.mapviewer.server.wms.capabilities.WMSUtil; import de.fhg.igd.mapviewer.server.wms.wizard.WMSWizardPage; /** * Wizard page for configuring the spatial reference system to use. * * @author Simon Templer */ public class SRSConfigurationPage extends WMSWizardPage<WMSConfiguration> { private static class SRSLabelProvider extends LabelProvider { @Override public String getText(Object element) { String text = element.toString(); if (text.equals(SRS_ANY)) { return text; } else { try { CoordinateReferenceSystem crs = CRS.decode(text); return crs.getName().toString() + " (" + text + ")"; } catch (Throwable e) { return text; } } } } private static final Log log = LogFactory.getLog(SRSConfigurationPage.class); private static final String SRS_ANY = Messages.SRSConfigurationPage_0; private final BasicConfigurationPage conf; private ComboViewer viewer; private WMSCapabilities capabilities = null; /** * Constructor * * @param conf the basic WMS configuration * @param configuration the WMS client configuration */ public SRSConfigurationPage(final BasicConfigurationPage conf, WMSConfiguration configuration) { super(configuration, "SRS"); //$NON-NLS-1$ this.conf = conf; setTitle(Messages.SRSConfigurationPage_2); setMessage(Messages.SRSConfigurationPage_3); } /** * @see WMSWizardPage#createContent(Composite) */ @Override public void createContent(Composite parent) { Composite page = new Composite(parent, SWT.NONE); page.setLayout(new GridLayout(1, false)); // SRS Combo combo = new Combo(page, SWT.DROP_DOWN | SWT.READ_ONLY); combo.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); viewer = new ComboViewer(combo); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new SRSLabelProvider()); viewer.addPostSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { update(); } }); setControl(page); update(); } private void update() { setPageComplete(!viewer.getSelection().isEmpty()); } /** * @see WMSWizardPage#updateConfiguration(WMSConfiguration) */ @Override public boolean updateConfiguration(WMSConfiguration configuration) { ISelection selection = viewer.getSelection(); if (selection != null && selection instanceof IStructuredSelection) { try { String srs = (String) ((IStructuredSelection) selection).getFirstElement(); if (srs.equals(SRS_ANY)) { configuration.setPreferredEpsg(0); } else { configuration.setPreferredEpsg(Integer.parseInt(srs.substring(5))); } return true; } catch (Exception e) { log.warn("Error setting SRS", e); //$NON-NLS-1$ } } return false; } /** * @see WMSWizardPage#onShowPage() */ @Override protected void onShowPage() { // get last selection ISelection selection = viewer.getSelection(); String lastSelection = null; if (selection != null && selection instanceof IStructuredSelection) { lastSelection = (String) ((IStructuredSelection) selection).getFirstElement(); } // update input String url = conf.getServiceURL(); List<String> input = new ArrayList<String>(); input.add(SRS_ANY); try { capabilities = WMSUtil.getCapabilities(url); // for (String srs : capabilities.getBoundingBoxes().keySet()) { // input.add(srs); // } for (String srs : capabilities.getSupportedSRS()) { try { CRS.decode(srs); // test if known input.add(srs); } catch (Exception e) { // ignore - unknown } } } catch (WMSCapabilitiesException e) { // ignore } viewer.setInput(input); // update selection if (lastSelection == null) { String def = "EPSG:" + getConfiguration().getPreferredEpsg(); //$NON-NLS-1$ if (input.contains(def)) { lastSelection = def; } else { lastSelection = SRS_ANY; } } viewer.setSelection(new StructuredSelection(lastSelection)); } }