/*******************************************************************************
* 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.darwin;
import java.util.Collection;
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.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
/**
* Dialog used to select a URL to open from a Darwin discovery result.
*
* @author Michael de Hoog (michael.dehoog@ga.gov.au)
*/
public class DarwinURLSelectionDialog extends StatusDialog
{
private final List<DarwinDiscoveryResultURL> urls;
private DarwinDiscoveryResultURL selected;
private Button okButton;
private TableViewer viewer;
private CLabel urlLabel;
public DarwinURLSelectionDialog(Shell parent, List<DarwinDiscoveryResultURL> urls)
{
super(parent);
this.urls = urls;
}
public DarwinDiscoveryResultURL getSelected()
{
return selected;
}
public void setSelected(DarwinDiscoveryResultURL selected)
{
this.selected = selected;
}
@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));
GridLayout layout = new GridLayout();
layout.marginTop = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
comp.setLayout(layout);
initializeDialogUnits(comp);
viewer = new TableViewer(comp, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
//set max size (actual size is calculated below):
gd.widthHint = 600;
gd.heightHint = 400;
viewer.getTable().setLayoutData(gd);
viewer.setContentProvider(new ArrayContentProvider());
viewer.setLabelProvider(new LabelProvider());
viewer.setInput(urls);
DarwinDiscoveryResultURL longestUrl = urlWithLongestName(urls);
if (longestUrl != null)
{
GC gc = new GC(viewer.getTable());
Point point = gc.textExtent(longestUrl.getName());
gc.dispose();
gd.widthHint = Math.min(gd.widthHint, point.x);
}
int height = viewer.getTable().getItemHeight() * urls.size() + viewer.getTable().getHeaderHeight();
if (height < gd.heightHint)
{
//if height of all rows is less than the max height, then use the default height:
gd.heightHint = SWT.DEFAULT;
}
//keep the column width in sync with the table width
final TableColumn resultsColumn = new TableColumn(viewer.getTable(), SWT.LEFT);
Listener resizeListener = new Listener()
{
@Override
public void handleEvent(Event event)
{
resultsColumn.setWidth(viewer.getTable().getClientArea().width);
}
};
viewer.getControl().addListener(SWT.Resize, resizeListener);
viewer.getControl().addListener(SWT.Paint, resizeListener);
if (selected != null)
{
viewer.setSelection(new StructuredSelection(selected));
}
else if (urls.size() == 1)
{
viewer.getTable().select(0);
}
else
{
//if there is a WMS url, select it by default
for (DarwinDiscoveryResultURL url : urls)
{
if (url.getProtocol().toLowerCase().contains("wms")) //$NON-NLS-1$
{
viewer.setSelection(new StructuredSelection(url));
break;
}
}
}
viewer.addSelectionChangedListener(new ISelectionChangedListener()
{
@Override
public void selectionChanged(SelectionChangedEvent event)
{
validate();
}
});
ColumnViewerToolTipSupport.enableFor(viewer);
urlLabel = new CLabel(comp, SWT.NONE);
urlLabel.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
Dialog.applyDialogFont(comp);
return comp;
}
private void validate()
{
selected = (DarwinDiscoveryResultURL) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
urlLabel.setText(selected == null ? "" : selected.getUrl().toString().replace("&", "&&")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
boolean valid = selected != null;
okButton.setEnabled(valid);
}
private static DarwinDiscoveryResultURL urlWithLongestName(Collection<DarwinDiscoveryResultURL> urls)
{
DarwinDiscoveryResultURL longest = null;
int maxLength = 0;
for (DarwinDiscoveryResultURL url : urls)
{
int length = url.getName().length();
if (length > maxLength)
{
maxLength = length;
longest = url;
}
}
return longest;
}
private static class LabelProvider extends ColumnLabelProvider
{
@Override
public String getText(Object element)
{
return ((DarwinDiscoveryResultURL) element).getName();
}
@Override
public Image getImage(Object element)
{
return super.getImage(element);
}
@Override
public String getToolTipText(Object element)
{
return ((DarwinDiscoveryResultURL) element).getUrl().toString();
}
}
}