/*******************************************************************************
* 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.ui.preferences;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.URLTransfer;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
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 org.eclipse.swt.widgets.Text;
import au.gov.ga.earthsci.common.ui.util.TextURLDropAdapter;
import au.gov.ga.earthsci.discovery.DiscoveryProviderRegistry;
import au.gov.ga.earthsci.discovery.IDiscoveryProvider;
import au.gov.ga.earthsci.discovery.IDiscoveryService;
import au.gov.ga.earthsci.discovery.IDiscoveryServiceProperty;
import au.gov.ga.earthsci.discovery.ui.Messages;
/**
* Dialog used to edit/create discovery services.
*
* @author Michael de Hoog (michael.dehoog@ga.gov.au)
*/
public class EditDiscoveryServiceDialog extends StatusDialog
{
private IDiscoveryService service = null;
private IDiscoveryService originalService = null;
private Button okButton;
private Combo typeCombo;
private Text nameText;
private Text urlText;
private List<IDiscoveryProvider> providers;
private Label[] propertyLabels;
private Control[] propertyControls;
public EditDiscoveryServiceDialog(Shell parent)
{
super(parent);
}
public IDiscoveryService getService()
{
return service;
}
public void setService(IDiscoveryService service)
{
this.service = service;
this.originalService = service;
}
@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 Control createDialogArea(Composite parent)
{
Composite comp = new Composite(parent, SWT.NONE);
initializeDialogUnits(comp);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginTop = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
createTypeCombo(comp);
createNameField(comp);
createLocationField(comp);
createProviderPropertyControls(comp, false);
comp.setLayout(layout);
GridData data = new GridData();
comp.setLayoutData(data);
Dialog.applyDialogFont(comp);
return comp;
}
protected void createTypeCombo(final Composite parent)
{
providers = new ArrayList<IDiscoveryProvider>(DiscoveryProviderRegistry.getProviders());
Collections.sort(providers, new DiscoveryProviderComparator());
String[] items = new String[providers.size()];
int selectedIndex = -1;
for (int i = 0; i < providers.size(); i++)
{
IDiscoveryProvider provider = providers.get(i);
items[i] = provider.getName() != null ? provider.getName() : ""; //$NON-NLS-1$
if (service != null && service.getProvider() == provider)
{
selectedIndex = i;
}
}
Label typeLabel = new Label(parent, SWT.NONE);
typeLabel.setText(Messages.EditDiscoveryServiceDialog_TypeLabel);
typeCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
typeCombo.setItems(items);
typeCombo.select(selectedIndex);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
typeCombo.setLayoutData(data);
typeCombo.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
createProviderPropertyControls(parent, true);
validate();
}
});
}
protected void createNameField(Composite parent)
{
Label nameLabel = new Label(parent, SWT.NONE);
nameLabel.setText(Messages.EditDiscoveryServiceDialog_NameLabel);
nameText = new Text(parent, SWT.BORDER);
String name = service == null ? null : service.getName();
nameText.setText(name != null ? name : ""); //$NON-NLS-1$
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
nameText.setLayoutData(data);
nameText.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
validate();
}
});
}
protected void createLocationField(Composite parent)
{
Label urlLabel = new Label(parent, SWT.NONE);
urlLabel.setText(Messages.EditDiscoveryServiceDialog_LocationLabel);
urlText = new Text(parent, SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
urlText.setLayoutData(data);
DropTarget target = new DropTarget(urlText, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK);
target.setTransfer(new Transfer[] { URLTransfer.getInstance(), FileTransfer.getInstance() });
target.addDropListener(new TextURLDropAdapter(urlText, true));
URL url = service == null ? null : service.getServiceURL();
urlText.setText(url != null ? url.toString() : ""); //$NON-NLS-1$
urlText.setSelection(0, urlText.getText().length());
urlText.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
validate();
}
});
}
protected void createProviderPropertyControls(Composite parent, boolean packShell)
{
if (propertyControls != null)
{
for (Control control : propertyControls)
{
if (control != null)
{
control.dispose();
}
}
for (Label label : propertyLabels)
{
if (label != null)
{
label.dispose();
}
}
}
IDiscoveryProvider provider = null;
int selectedIndex = typeCombo.getSelectionIndex();
if (selectedIndex >= 0)
{
provider = providers.get(selectedIndex);
}
@SuppressWarnings("unchecked")
IDiscoveryServiceProperty<Object>[] properties =
provider == null ? null : (IDiscoveryServiceProperty<Object>[]) provider.getProperties();
if (properties == null)
{
propertyControls = new Control[0];
propertyLabels = new Label[0];
}
else
{
propertyControls = new Control[properties.length];
propertyLabels = new Label[properties.length];
for (int i = 0; i < properties.length; i++)
{
IDiscoveryServiceProperty<Object> property = properties[i];
String label = property.getLabel();
label = label != null ? label + ":" : ""; //$NON-NLS-1$ //$NON-NLS-2$
propertyLabels[i] = new Label(parent, SWT.NONE);
propertyLabels[i].setText(label);
Object value = null;
if (originalService != null && originalService.getProvider() == provider)
{
value = property.getValue(originalService);
}
else if (service != null && service.getProvider() == provider)
{
value = property.getValue(service);
}
propertyControls[i] = property.createControl(parent, value, new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
validate();
}
});
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
propertyControls[i].setLayoutData(data);
}
}
parent.pack();
if (packShell)
{
getShell().pack();
}
}
protected void validate()
{
service = null;
IDiscoveryProvider provider = null;
int selectedIndex = typeCombo.getSelectionIndex();
if (selectedIndex >= 0)
{
provider = providers.get(selectedIndex);
}
String name = nameText.getText();
URL url;
try
{
url = new URL(urlText.getText());
}
catch (MalformedURLException e)
{
url = null;
}
if (provider != null)
{
IDiscoveryServiceProperty<?>[] properties = provider.getProperties();
boolean valid = name != null && url != null;
if (valid)
{
if (properties != null)
{
for (int i = 0; i < properties.length && valid; i++)
{
IDiscoveryServiceProperty<?> property = properties[i];
valid &= property.validate(propertyControls[i]);
}
}
}
if (valid)
{
Map<IDiscoveryServiceProperty<?>, Object> propertyValues =
new HashMap<IDiscoveryServiceProperty<?>, Object>();
if (properties != null)
{
for (int i = 0; i < properties.length && valid; i++)
{
IDiscoveryServiceProperty<?> property = properties[i];
Object value = property.getValue(propertyControls[i]);
propertyValues.put(property, value);
}
}
service = provider.createService(name, url, propertyValues);
}
}
okButton.setEnabled(service != null);
}
}