au.gov.ga.earthsci.discovery.ui.preferences.EditDiscoveryServiceDialog.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ga.earthsci.discovery.ui.preferences.EditDiscoveryServiceDialog.java

Source

/*******************************************************************************
 * 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);
    }
}