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

Java tutorial

Introduction

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

Source

/*****************************************************************************
 * Copyright (c) 2006-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
 *    Ariel Garcia      - switch to use a CheckboxTableViewer
 *                      - make it a IGridModelListener
 *****************************************************************************/

package eu.geclipse.ui.wizards;

import java.net.URL;
import java.util.ArrayList;

import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
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.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.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PreferencesUtil;

import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IGridInfoService;
import eu.geclipse.core.model.IGridModelEvent;
import eu.geclipse.core.model.IGridModelListener;
import eu.geclipse.core.model.IVirtualOrganization;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.ui.dialogs.ProblemDialog;
import eu.geclipse.ui.internal.Activator;

/**
 * A wizard page allowing to select a VO from the list of VOs registered
 * in the VO manager. It also allows to edit the VOs on the fly by opening
 * the VO preferences page.
 */
public class VoSelectionWizardPage extends WizardPage implements IGridModelListener {

    CheckboxTableViewer tableViewer;
    java.util.List<IVirtualOrganization> voList;
    Class<?> voType;
    boolean allowMultiSelection;

    private Text infoText;

    private final String PREFERENCE_PAGE_ID = "eu.geclipse.ui.internal.preference.VOPreferencePage"; //$NON-NLS-1$

    public VoSelectionWizardPage(final boolean allowMultiSelection) {
        this(allowMultiSelection, null);
    }

    public VoSelectionWizardPage(final boolean allowMultiSelection, final Class<?> voType) {
        super("eu.geclipse.ui.voSelectionWizardPage", //$NON-NLS-1$
                "VO Selection Page", null);
        setDescription("Specify the VO that should be used");
        URL imgUrl = Activator.getDefault().getBundle().getEntry("icons/wizban/vo_wiz.gif"); //$NON-NLS-1$
        setImageDescriptor(ImageDescriptor.createFromURL(imgUrl));
        this.allowMultiSelection = allowMultiSelection;
        this.voType = voType;
        this.voList = new ArrayList<IVirtualOrganization>();
    }

    public void createControl(final Composite parent) {

        GridData gData;

        Composite mainComp = new Composite(parent, SWT.NONE);
        mainComp.setLayout(new GridLayout(1, false));
        gData = new GridData(GridData.FILL_BOTH);
        gData.grabExcessHorizontalSpace = true;
        gData.grabExcessVerticalSpace = true;
        mainComp.setLayoutData(gData);

        Group voGroup = new Group(mainComp, SWT.NONE);
        voGroup.setLayout(new GridLayout(2, false));
        voGroup.setText("&Available VOs");
        gData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gData.heightHint = 120;
        voGroup.setLayoutData(gData);

        int style = SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.CHECK;
        Table voTable = new Table(voGroup, style);
        gData = new GridData(SWT.FILL, SWT.FILL, true, true);
        voTable.setLayoutData(gData);
        voTable.setHeaderVisible(false);

        this.tableViewer = new CheckboxTableViewer(voTable);
        this.tableViewer.setContentProvider(new ArrayContentProvider());
        this.tableViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(final Object element) {
                return ((IVirtualOrganization) element).getName();
            }
        });

        this.tableViewer.setComparator(new ViewerComparator() {
            @Override
            public int compare(final Viewer viewer, final Object vo1, final Object vo2) {
                String name1 = ((IVirtualOrganization) vo1).getName();
                String name2 = ((IVirtualOrganization) vo2).getName();
                // Sort by VO name
                return name1.compareTo(name2);
            }
        });

        // Filter the VOs that can be used to create this type of auth-token
        this.tableViewer.addFilter(new ViewerFilter() {
            @Override
            public boolean select(final Viewer viewer, final Object parentElement, final Object element) {
                boolean ret = false;

                Class<?> type = VoSelectionWizardPage.this.voType;
                if (element instanceof IVirtualOrganization) {
                    IVirtualOrganization vo = (IVirtualOrganization) element;
                    if ((type == null) || type.isAssignableFrom(vo.getClass())) {
                        ret = true;
                    }
                }
                return ret;
            }
        });

        this.tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(final SelectionChangedEvent event) {
                showSelectedInfo();
            }
        });

        this.tableViewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(final CheckStateChangedEvent event) {

                // If allowMultiSelection is not set, then implement a radio-button behavior
                if (!VoSelectionWizardPage.this.allowMultiSelection) {
                    Object element = event.getElement();
                    if (element instanceof IVirtualOrganization) {
                        IVirtualOrganization vo = (IVirtualOrganization) element;
                        if (event.getChecked()) {
                            VoSelectionWizardPage.this.tableViewer.setCheckedElements(new Object[] { vo });
                            VoSelectionWizardPage.this.tableViewer.refresh();
                        }
                    }
                }

                setPageComplete(getSelectedVos() != null);
            }
        });

        updateVoList();
        this.tableViewer.setInput(this.voList);

        // Listen on new VOs, this will update the tableViewer
        GridModel.getVoManager().addGridModelListener(this);

        Button editVOsButton = new Button(voGroup, SWT.PUSH);
        editVOsButton.setText("Edit &VOs...");
        gData = new GridData();
        gData.horizontalAlignment = GridData.BEGINNING;
        gData.verticalAlignment = GridData.BEGINNING;
        editVOsButton.setLayoutData(gData);
        editVOsButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(getShell(),
                        VoSelectionWizardPage.this.PREFERENCE_PAGE_ID, null, null);

                /*
                 * Even if the user pressed 'Cancel' VOs might have been
                 * added/deleted, so ignore the dialog's return value.
                 */
                dialog.open();
            }
        });

        Group infoGroup = new Group(mainComp, SWT.NONE);
        infoGroup.setLayout(new GridLayout(1, false));
        infoGroup.setText("&VO Info");
        gData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gData.heightHint = 120;
        infoGroup.setLayoutData(gData);

        this.infoText = new Text(infoGroup, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        this.infoText.setEditable(false);
        gData = new GridData(GridData.FILL_BOTH);
        gData.grabExcessHorizontalSpace = true;
        gData.grabExcessVerticalSpace = true;
        this.infoText.setLayoutData(gData);

        setInitialSelection();
        showSelectedInfo();
        setPageComplete(getSelectedVos() != null);

        setControl(mainComp);

    }

    /*
     * (non-Javadoc)
     * @see eu.geclipse.core.model.IGridModelListener#gridModelChanged(eu.geclipse.core.model.IGridModelEvent)
     */
    public void gridModelChanged(final IGridModelEvent event) {
        IGridElement[] elements = event.getElements();

        // We are a listener of the VoManager only
        assert elements[0] instanceof IVirtualOrganization : "VoSelectionWizardPage expects events whose source is an IVirtualOrganization."; //$NON-NLS-1$

        switch (event.getType()) {
        case IGridModelEvent.ELEMENTS_ADDED:
            updateVoList();
            this.tableViewer.setInput(this.voList);
            // Each event contains a single element
            setSelection(elements[0]);
            break;
        case IGridModelEvent.ELEMENTS_REMOVED:
            updateVoList();
            this.tableViewer.setInput(this.voList);
            // If the selected VO has been deleted select the default one
            IVirtualOrganization[] selectedVOs = getSelectedVos();
            if (selectedVOs == null) {
                setInitialSelection();
            }
            break;
        default:
            // Do nothing in other cases
        }
        setPageComplete(getSelectedVos() != null);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.DialogPage#dispose()
     */
    @Override
    public void dispose() {
        GridModel.getVoManager().removeGridModelListener(this);
        super.dispose();
    }

    /**
     * Get the list of checked VOs
     * 
     * @return the array of VOs checked in the viewer
     */
    public IVirtualOrganization[] getSelectedVos() {

        java.util.List<IVirtualOrganization> selectedVos = new ArrayList<IVirtualOrganization>();

        for (Object vo : this.tableViewer.getCheckedElements()) {
            selectedVos.add((IVirtualOrganization) vo);
        }

        if (selectedVos.size() == 0) {
            setErrorMessage("No valid VO is selected");
        } else {
            setErrorMessage(null);
        }

        return selectedVos.size() == 0 ? null : selectedVos.toArray(new IVirtualOrganization[selectedVos.size()]);
    }

    /**
     * Select the given VOs by setting the checkboxes
     * 
     * @param vos an array of VOs to check on the viewer
     */
    public void setSelectedVos(final IGridElement[] vos) {
        if (vos == null || vos.length == 0) {
            return;
        }

        if (VoSelectionWizardPage.this.allowMultiSelection) {
            this.tableViewer.setCheckedElements(vos);
        } else {
            assert vos.length == 1 : "VoSelectionWizardPage got more than one VO to select while allowMultiSelection=false."; //$NON-NLS-1$
            this.tableViewer.setChecked(vos[0], true);
        }
        this.tableViewer.refresh();
    }

    protected void showSelectedInfo() {
        int index = this.tableViewer.getTable().getSelectionIndex();
        if (index >= 0) {
            IVirtualOrganization vo = (IVirtualOrganization) this.tableViewer.getElementAt(index);
            try {
                String text = ""; //$NON-NLS-1$
                text += "Name:\n\t" + vo.getName() + '\n';
                text += "Type:\n\t" + vo.getTypeName() + '\n';
                IGridInfoService infoService = vo.getInfoService();
                if (infoService != null) {
                    text += "\nInformation Service:\n\tName:\n\t\t" + infoService.getName();
                    text += "\n\tURI:\n\t\t" + infoService.getURI().toString();
                }

                //
                // This forces an Infosystem query for every click on a VO!! 
                //   Don't show non-static info here!
                /*
                IGridService[] services = vo.getServices();
                text += "\n\nOther Services:";
                if ( ( services != null ) && ( services.length > 1 ) ) {
                  for ( IGridService service : services ) {
                    if ( service != infoService ) {
                      text += "\n\tName:\n\t\t" + service.getName();
                      URI uri = service.getURI();
                      if ( uri != null ) {
                        text += "\n\tURI:\n\t\t" + service.getURI().toString();
                      } else {
                        text += "\n\tURI:\n\t\tN/A";
                      }
                    }
                  }
                } else {
                  text += "\n\tNone";
                }
                */
                this.infoText.setText(text);
            } catch (ProblemException pExc) {
                ProblemDialog.openProblem(getShell(), "VO info problem",
                        "Unable to query services for VO " + vo.getName(), pExc);
            }
        } else {
            this.infoText.setText(""); //$NON-NLS-1$
        }
        // This is needed if the text is changed while the dialog is not focused
        this.infoText.redraw();
    }

    /**
     * Load the list of VOs from the manager.
     */
    private void updateVoList() {
        this.voList.clear();
        try {
            IGridElement[] vos = GridModel.getVoManager().getChildren(null);
            for (IGridElement vo : vos) {
                this.voList.add((IVirtualOrganization) vo);
            }
        } catch (ProblemException pExc) {
            ProblemDialog.openProblem(getShell(), "VO list problem", "Unable to query registered VOs", pExc);
        }
    }

    /**
     * Set the specified VO as selected (clicked and checked) in the viewer.
     * 
     * @param vo the VO to set as checked/selected
     */
    private void setSelection(final IGridElement vo) {

        // Do nothing if there is no VO to select
        if (vo == null || !(vo instanceof IVirtualOrganization)) {
            return;
        }

        // If allowMultiSelection is not set we implement a radio-button behavior
        if (VoSelectionWizardPage.this.allowMultiSelection) {
            this.tableViewer.setChecked(vo, true);
        } else {
            this.tableViewer.setCheckedElements(new Object[] { vo });
        }
        this.tableViewer.refresh();

        StructuredSelection sel = new StructuredSelection(vo);
        this.tableViewer.setSelection(sel, true);
    }

    /**
     * Determines which VO to select initially in the viewer.
     */
    private void setInitialSelection() {
        IGridElement defaultVo = GridModel.getVoManager().getDefault();

        if (defaultVo == null) {
            // No default VO, take the first entry if any, null otherwise
            defaultVo = (IGridElement) this.tableViewer.getElementAt(0);
        } else {
            // Check if the default VO is of the requested voType
            boolean show = true;
            for (ViewerFilter filter : this.tableViewer.getFilters()) {
                show &= filter.select(this.tableViewer, this.voList, defaultVo);
            }
            // If it is not, then select the first of the list if any, null otherwise
            if (!show) {
                defaultVo = (IGridElement) this.tableViewer.getElementAt(0);
            }
        }

        setSelection(defaultVo);
    }

}