/*******************************************************************************
* Copyright 2013 Geoscience Australia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package au.gov.ga.earthsci.discovery.csw;
import java.net.URL;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Shell;
import au.gov.ga.earthsci.worldwind.common.util.URLUtil;
/**
* Dialog used to select a URL to open from a CSW discovery result.
*
* @author Michael de Hoog (michael.dehoog@ga.gov.au)
*/
public class CSWURLSelectionDialog extends StatusDialog
{
private final List<URL> urls;
private URL selectedUrl;
private URL finalUrl;
private Button okButton;
private Button getCapabilitiesButton;
private org.eclipse.swt.widgets.List urlList;
private Label finalUrlLabel;
public CSWURLSelectionDialog(Shell parent, List<URL> urls)
{
super(parent);
this.urls = urls;
}
public URL getSelectedUrl()
{
return selectedUrl;
}
public void setSelectedUrl(URL selectedUrl)
{
this.selectedUrl = selectedUrl;
}
public URL getFinalUrl()
{
return finalUrl;
}
@Override
protected void createButtonsForButtonBar(Composite parent)
{
okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
validate();
}
@Override
protected void setShellStyle(int newShellStyle)
{
super.setShellStyle(newShellStyle | SWT.RESIZE);
}
@Override
protected Control createDialogArea(Composite parent)
{
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
initializeDialogUnits(comp);
GridLayout layout = new GridLayout();
layout.marginTop = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
urlList = new org.eclipse.swt.widgets.List(comp, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
urlList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
int maxCountOfWms = 0;
int selectedIndex = -1;
for (int i = 0; i < urls.size(); i++)
{
URL url = urls.get(i);
String urlString = url.toString();
urlList.add(urlString);
int countOfWms = countStringOccurences(urlString.toLowerCase(), "wms"); //$NON-NLS-1$
if (countOfWms > maxCountOfWms)
{
maxCountOfWms = countOfWms;
selectedIndex = i;
}
}
if (selectedIndex < 0 && !urls.isEmpty())
{
selectedIndex = 0;
}
if (selectedUrl != null)
{
int indexOfSelectedUrl = urls.indexOf(selectedUrl);
selectedIndex = indexOfSelectedUrl >= 0 ? indexOfSelectedUrl : selectedIndex;
}
if (selectedIndex >= 0)
{
urlList.select(selectedIndex);
}
urlList.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
validate();
}
});
getCapabilitiesButton = new Button(comp, SWT.CHECK);
getCapabilitiesButton.setText(Messages.CSWURLSelectionDialog_GetCapabilitiesButtonText);
getCapabilitiesButton.setSelection(true);
getCapabilitiesButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
validate();
}
});
finalUrlLabel = new Label(comp, SWT.NONE);
finalUrlLabel.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
comp.setLayout(layout);
Dialog.applyDialogFont(comp);
return comp;
}
private void validate()
{
int selectedIndex = urlList.getSelectionIndex();
URL oldSelectedUrl = selectedUrl;
selectedUrl = selectedIndex < 0 ? null : urls.get(selectedIndex);
if (oldSelectedUrl != selectedUrl)
{
updateGetCapabilitiesButton();
}
updateFinalUrl();
finalUrlLabel.setText(finalUrl == null ? "" : finalUrl.toString().replace("&", "&&")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
boolean valid = selectedUrl != null;
okButton.setEnabled(valid);
}
private void updateGetCapabilitiesButton()
{
if (selectedUrl == null)
{
return;
}
String lower = selectedUrl.toString().toLowerCase();
if (lower.contains("request=getcapabilities")) //$NON-NLS-1$
{
getCapabilitiesButton.setSelection(true);
getCapabilitiesButton.setEnabled(false);
}
else
{
getCapabilitiesButton.setEnabled(true);
boolean containsOGC = lower.contains("wms") || lower.contains("wcs") || lower.contains("wfs"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
getCapabilitiesButton.setSelection(containsOGC);
}
}
private void updateFinalUrl()
{
if (selectedUrl == null)
{
finalUrl = null;
return;
}
else if (!getCapabilitiesButton.getSelection() || !getCapabilitiesButton.isEnabled())
{
finalUrl = selectedUrl;
return;
}
String urlString = selectedUrl.toString();
String lower = urlString.toLowerCase();
if (lower.contains("wms")) //$NON-NLS-1$
{
urlString = URLUtil.addQueryParameter(urlString, "service=WMS"); //$NON-NLS-1$
}
else if (lower.contains("wfs")) //$NON-NLS-1$
{
urlString = URLUtil.addQueryParameter(urlString, "service=WFS"); //$NON-NLS-1$
}
else if (lower.contains("wcs")) //$NON-NLS-1$
{
urlString = URLUtil.addQueryParameter(urlString, "service=WCS"); //$NON-NLS-1$
}
urlString = URLUtil.addQueryParameter(urlString, "request=GetCapabilities"); //$NON-NLS-1$
try
{
finalUrl = new URL(urlString);
}
catch (Exception e)
{
e.printStackTrace();
finalUrl = selectedUrl;
}
}
private static int countStringOccurences(String string, String substring)
{
int count = 0;
int start = 0;
int length = substring.length();
while ((start = string.indexOf(substring, start) + length) >= length)
{
count++;
}
return count;
}
}