eu.geclipse.ui.wizards.VoServiceSelectionPage.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.ui.wizards.VoServiceSelectionPage.java

Source

/*****************************************************************************
 * Copyright (c) 2008 g-Eclipse Consortium 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Initial development of the original code was made for the
 * g-Eclipse project founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributors:
 *    Mathias Stuempert - initial API and implementation
 *****************************************************************************/

package eu.geclipse.ui.wizards;

import java.net.URI;
import java.net.URL;
import java.util.Hashtable;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import eu.geclipse.core.Extensions;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IGridElementCreator;
import eu.geclipse.core.model.IGridService;
import eu.geclipse.core.model.impl.GenericVirtualOrganization;
import eu.geclipse.core.model.impl.GenericVoCreator;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.ui.dialogs.ServiceDialog;
import eu.geclipse.ui.internal.Activator;

public class VoServiceSelectionPage extends WizardPage {

    private static final String SERVICE_IMAGE = "icons/obj16/service_obj.gif"; //$NON-NLS-1$

    private static final String SERVICE_NEW_IMAGE = "icons/obj16/service_new_obj.gif"; //$NON-NLS-1$

    private static final String CONFIGURATION_DATA_KEY = "configuration"; //$NON-NLS-1$

    private static final String SERVICE_DATA_KEY = "service"; //$NON-NLS-1$

    private static final String URI_DATA_KEY = "uri"; //$NON-NLS-1$

    private static Hashtable<String, Image> images = new Hashtable<String, Image>();

    private GenericVirtualOrganization initialVo;

    private Table serviceTable;

    private Button addButton;

    private Button removeButton;

    public VoServiceSelectionPage() {
        super("voServiceSelectionPage", //$NON-NLS-1$
                "Service Selection", null);
        setDescription("Add services to your VO");
        URL imgUrl = Activator.getDefault().getBundle().getEntry("icons/wizban/vo_wiz.gif"); //$NON-NLS-1$
        setImageDescriptor(ImageDescriptor.createFromURL(imgUrl));
    }

    public IStatus apply(final GenericVoCreator creator) {

        IStatus result = Status.OK_STATUS;
        TableItem[] items = this.serviceTable.getItems();

        for (TableItem item : items) {

            try {

                IGridService service = (IGridService) item.getData(SERVICE_DATA_KEY);
                IConfigurationElement element = (IConfigurationElement) item.getData(CONFIGURATION_DATA_KEY);
                URI uri = (URI) item.getData(URI_DATA_KEY);

                if (service != null) {
                    creator.maintainService(service);
                }

                else if ((element != null) && (uri != null)) {
                    IGridElementCreator serviceCreator = (IGridElementCreator) element
                            .createExecutableExtension(Extensions.GRID_ELEMENT_CREATOR_EXECUTABLE);
                    creator.createService(serviceCreator, uri);
                }

            } catch (Exception exc) {
                result = new Status(IStatus.ERROR, Activator.PLUGIN_ID, exc.getLocalizedMessage(), exc);
                break;
            }

        }

        return result;

    }

    public void createControl(final Composite parent) {

        Composite mainComp = new Composite(parent, SWT.NONE);
        mainComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        mainComp.setLayout(new GridLayout(2, false));

        Label label = new Label(mainComp, SWT.NONE);
        label.setText("Services");
        GridData labelData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
        labelData.horizontalSpan = 2;
        label.setLayoutData(labelData);

        this.serviceTable = new Table(mainComp,
                SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
        this.serviceTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        this.serviceTable.setHeaderVisible(true);
        this.serviceTable.setLinesVisible(true);

        TableColumn typeColumn = new TableColumn(this.serviceTable, SWT.NULL);
        typeColumn.setText("Type/Name");
        typeColumn.setWidth(150);
        TableColumn urlColumn = new TableColumn(this.serviceTable, SWT.NULL);
        urlColumn.setText("Endpoint");
        urlColumn.setWidth(300);

        Composite buttonComp = new Composite(mainComp, SWT.NONE);
        buttonComp.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
        buttonComp.setLayout(new GridLayout(1, false));

        this.addButton = new Button(buttonComp, SWT.NONE);
        this.addButton.setText("&Add...");
        this.addButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));

        this.removeButton = new Button(buttonComp, SWT.NONE);
        this.removeButton.setText("&Remove");
        this.removeButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));

        this.serviceTable.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                updateUI();
            }
        });

        this.addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                showServiceDialog();
            }
        });

        this.removeButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                removeSelectedServices();
                updateUI();
            }
        });

        if (this.initialVo != null) {
            initVo(this.initialVo);
        }

        updateUI();

        setControl(mainComp);

    }

    /**
     * Initializes the controls of this wizard page with the attributes
     * of the specified VO.
     * 
     * @param vo The VO whose attributes should be set to the page's controls.
     * @throws ProblemException If any error occurs.
     */
    protected void initVo(final GenericVirtualOrganization vo) {

        try {

            IGridElement[] children = vo.getChildren(null);

            for (IGridElement child : children) {
                if (child instanceof IGridService) {
                    IGridService service = (IGridService) child;
                    TableItem item = new TableItem(this.serviceTable, SWT.NONE);
                    item.setText(0, service.getName());
                    item.setText(1, service.getURI().toString());
                    item.setImage(getImage(SERVICE_IMAGE));
                    item.setData(SERVICE_DATA_KEY, service);
                }
            }

        } catch (ProblemException pExc) {
            Activator.logException(pExc);
        }

    }

    protected void removeSelectedServices() {
        int[] indices = this.serviceTable.getSelectionIndices();
        this.serviceTable.remove(indices);
    }

    /**
     * Set the specified VO as initial VO. This means that the controls
     * of the page will be initialized with the attributes of the specified
     * VO.
     * 
     * @param vo The initial VO.
     */
    protected void setInitialVo(final GenericVirtualOrganization vo) {
        this.initialVo = vo;
    }

    protected void showServiceDialog() {
        ServiceDialog dialog = new ServiceDialog(getShell());
        if (dialog.open() == Window.OK) {
            IConfigurationElement selectedElement = dialog.getSelectedElement();
            URI selectedURI = dialog.getSelectedURI();
            TableItem item = new TableItem(this.serviceTable, SWT.NONE);
            item.setText(0, selectedElement.getAttribute(Extensions.GRID_ELEMENT_CREATOR_NAME_ATTRIBUTE));
            item.setText(1, selectedURI.toString());
            item.setData(CONFIGURATION_DATA_KEY, selectedElement);
            item.setData(URI_DATA_KEY, selectedURI);
            item.setImage(getImage(SERVICE_NEW_IMAGE));
        }
    }

    protected static Image getImage(final String name) {

        Image result = images.get(name);

        if (result == null) {
            URL url = Activator.getDefault().getBundle().getResource(name);
            ImageDescriptor desc = ImageDescriptor.createFromURL(url);
            result = desc.createImage();
            images.put(name, result);
        }

        return result;

    }

    protected void updateUI() {
        boolean selected = this.serviceTable.getSelectionCount() > 0;
        this.removeButton.setEnabled(selected);
    }

}