eu.geclipse.ui.internal.wizards.VoChooserPage.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.ui.internal.wizards.VoChooserPage.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      - updated to new problem reporting
 *****************************************************************************/

package eu.geclipse.ui.internal.wizards;

import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;

import eu.geclipse.core.model.IVoLoader;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.ui.dialogs.ProblemDialog;

/**
 * Wizard page for selection VOs to be imported.
 */
public class VoChooserPage extends WizardPage {

    protected CheckboxTableViewer viewer;

    private static class VoFilter extends ViewerFilter {

        private String filterText;

        /**
         * This filters's default constructor.
         */
        public VoFilter() {
            super();
        }

        /**
         * Set the filter's text that is used to filter the view's content.
         * 
         * @param text The text that has to match the beginning of the VO name.
         */
        public void setFilterText(final String text) {
            this.filterText = text;
        }

        @Override
        public boolean select(final Viewer viewer, final Object parentElement, final Object element) {
            return (this.filterText == null) || (this.filterText.trim().length() == 0)
                    || ((String) element).toLowerCase().startsWith(this.filterText.toLowerCase());
        }

    }

    protected Text filterText;

    protected VoFilter voFilter;

    protected List<Object> selection = new ArrayList<Object>();

    private VoImportLocationChooserPage locationChooserPage;

    /**
     * Construct a new chooser page.
     * 
     * @param locationChooserPage The location chooser page of the same wizard.
     */
    public VoChooserPage(final VoImportLocationChooserPage locationChooserPage) {
        super("voChooserPage", //$NON-NLS-1$
                Messages.getString("VoChooserPage.title"), //$NON-NLS-1$
                null);
        setDescription(Messages.getString("VoChooserPage.description")); //$NON-NLS-1$
        this.locationChooserPage = locationChooserPage;
    }

    public void createControl(final Composite parent) {

        GridData gData;

        Composite mainComp = new Composite(parent, SWT.NULL);
        mainComp.setLayout(new GridLayout(1, false));
        gData = new GridData(GridData.FILL_BOTH);
        mainComp.setLayoutData(gData);

        this.filterText = new Text(mainComp, SWT.BORDER | SWT.SEARCH);
        this.filterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        this.filterText.setText(Messages.getString("VoChooserPage.initial_filter_text")); //$NON-NLS-1$
        this.filterText.selectAll();

        Table table = new Table(mainComp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK);
        gData = new GridData(GridData.FILL_BOTH);
        gData.grabExcessHorizontalSpace = true;
        gData.grabExcessVerticalSpace = true;
        table.setLayoutData(gData);

        this.viewer = new CheckboxTableViewer(table);
        this.viewer.setContentProvider(new ArrayContentProvider());
        this.voFilter = new VoFilter();
        this.viewer.addFilter(this.voFilter);

        Composite buttonComp = new Composite(mainComp, SWT.NULL);
        buttonComp.setLayout(new GridLayout(3, false));
        gData = new GridData();
        buttonComp.setLayoutData(gData);

        Button selectAllButton = new Button(buttonComp, SWT.PUSH);
        selectAllButton.setText(Messages.getString("VoChooserPage.select_all_button")); //$NON-NLS-1$
        gData = new GridData();
        selectAllButton.setLayoutData(gData);

        Button deselectAllButton = new Button(buttonComp, SWT.PUSH);
        deselectAllButton.setText(Messages.getString("VoChooserPage.deselect_all_button")); //$NON-NLS-1$
        gData = new GridData();
        deselectAllButton.setLayoutData(gData);

        Button invertButton = new Button(buttonComp, SWT.PUSH);
        invertButton.setText(Messages.getString("VoChooserPage.invert_selection_button")); //$NON-NLS-1$
        gData = new GridData();
        invertButton.setLayoutData(gData);

        this.viewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(final CheckStateChangedEvent event) {
                handleCheckStateChanged(event);
            }
        });

        this.filterText.addModifyListener(new ModifyListener() {
            public void modifyText(final ModifyEvent e) {
                VoChooserPage.this.voFilter.setFilterText(VoChooserPage.this.filterText.getText());
                VoChooserPage.this.viewer.refresh();
                VoChooserPage.this.viewer.setCheckedElements(
                        VoChooserPage.this.selection.toArray(new Object[VoChooserPage.this.selection.size()]));
            }
        });

        selectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                selectAll();
            }
        });

        deselectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                deselectAll();
            }
        });

        invertButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                invertSelection();
            }
        });

        setControl(mainComp);

    }

    /**
     * Get all selected VOs.
     * 
     * @return A list containing the names of all selected VOs.
     */
    public String[] getSelectedVos() {

        String[] result = null;

        result = new String[this.selection.size()];
        for (int i = 0; i < this.selection.size(); i++) {
            result[i] = (String) this.selection.get(i);
        }

        return result;

    }

    @Override
    public void setVisible(final boolean visible) {
        super.setVisible(visible);
        if (visible) {
            loadVoList();
            if (!this.filterText.isDisposed()) {
                this.filterText.setFocus();
            }
        }
    }

    protected void handleCheckStateChanged(final CheckStateChangedEvent event) {
        Object element = event.getElement();
        if (event.getChecked()) {
            addToSelection(new Object[] { element });
        } else if (!event.getChecked()) {
            removeFromSelection(new Object[] { element });
        }
    }

    protected void selectAll() {
        this.viewer.setAllChecked(true);
        addToSelection(this.viewer.getCheckedElements());
    }

    protected void deselectAll() {
        removeFromSelection(this.viewer.getCheckedElements());
        this.viewer.setAllChecked(false);
    }

    protected void invertSelection() {
        TableItem[] items = this.viewer.getTable().getItems();
        for (TableItem item : items) {
            String element = (String) item.getData();
            boolean state = this.viewer.getChecked(element);
            this.viewer.setChecked(element, !state);
            if (state) {
                removeFromSelection(new Object[] { element });
            } else {
                addToSelection(new Object[] { element });
            }
        }
    }

    private void addToSelection(final Object[] elements) {
        for (Object element : elements) {
            if (!this.selection.contains(element)) {
                this.selection.add(element);
            }
        }
    }

    private void removeFromSelection(final Object[] elements) {
        for (Object element : elements) {
            if (this.selection.contains(element)) {
                this.selection.remove(element);
            }
        }
    }

    private void loadVoList() {

        final IVoLoader loader = this.locationChooserPage.getLoader();
        final URI uri = this.locationChooserPage.getSelectedLocation();

        try {
            getContainer().run(false, true, new IRunnableWithProgress() {
                public void run(final IProgressMonitor monitor)
                        throws InvocationTargetException, InterruptedException {
                    try {
                        String[] voArray = loader.getVoList(uri, monitor);
                        List<String> voList = new ArrayList<String>();
                        for (String vo : voArray) {
                            if (!voList.contains(vo)) {
                                voList.add(vo);
                            }
                        }
                        VoChooserPage.this.viewer.setInput(voList);
                    } catch (ProblemException pExc) {
                        throw new InvocationTargetException(pExc);
                    }
                }
            });
        } catch (InvocationTargetException itExc) {
            Throwable cause = itExc.getCause();
            ProblemDialog.openProblem(getShell(), Messages.getString("VoChooserPage.import_failed_title"), //$NON-NLS-1$
                    Messages.getString("VoChooserPage.import_failed_error"), //$NON-NLS-1$
                    cause);
            setErrorMessage(cause.getLocalizedMessage());
        } catch (InterruptedException intExc) {
            // Do nothing on user interrupt
        }

    }

}