eu.geclipse.ui.internal.preference.VoPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.ui.internal.preference.VoPreferencePage.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
 *                      - added handling of default VO when adding/importing
 *****************************************************************************/

package eu.geclipse.ui.internal.preference;

import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IGridModelEvent;
import eu.geclipse.core.model.IGridModelListener;
import eu.geclipse.core.model.IGridProject;
import eu.geclipse.core.model.IVirtualOrganization;
import eu.geclipse.core.model.IVoManager;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.ui.comparators.TableColumnComparator;
import eu.geclipse.ui.dialogs.ProblemDialog;
import eu.geclipse.ui.internal.Activator;
import eu.geclipse.ui.internal.wizards.VoImportWizard;
import eu.geclipse.ui.listeners.TableColumnListener;
import eu.geclipse.ui.wizards.wizardselection.ExtPointWizardSelectionListPage;

/**
 * The VO preferences page which allows add, remove and edit the available VOs.
 */
public class VoPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IGridModelListener {

    /**
     * Content provider for the {@link VoPreferencePage}.
     */
    static class VoContentProvider implements IStructuredContentProvider {

        /**
         * The shell of the input.
         */
        private Shell shell;

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
         */
        public Object[] getElements(final Object inputElement) {
            IGridElement[] result = null;
            if (inputElement instanceof IVoManager) {
                IVoManager manager = (IVoManager) inputElement;
                try {
                    result = manager.getChildren(null);
                    Arrays.sort(result, new Comparator<IGridElement>() {
                        public int compare(final IGridElement vo1, final IGridElement vo2) {
                            return vo1.getName().compareTo(vo2.getName());
                        }
                    });
                } catch (ProblemException pExc) {
                    if (this.shell != null) {
                        ProblemDialog.openProblem(this.shell,
                                Messages.getString("VoPreferencePage.content_provider_problem"), //$NON-NLS-1$
                                Messages.getString("VoPreferencePage.query_vo_failed"), //$NON-NLS-1$
                                pExc);
                    } else {
                        Activator.logException(pExc);
                    }
                }
            }
            return result;
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
            // empty implementation
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
         */
        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
            if (viewer != null) {
                this.shell = viewer.getControl().getShell();
            }
        }

    }

    /**
     * Label provider for the {@link VoPreferencePage}.
     */
    static class VoLabelProvider extends LabelProvider implements ITableLabelProvider {

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
         */
        public Image getColumnImage(final Object element, final int columnIndex) {
            return null;
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
         */
        public String getColumnText(final Object element, final int columnIndex) {
            String text = null;
            if (element instanceof IVirtualOrganization) {
                switch (columnIndex) {
                case 0:
                    text = ((IVirtualOrganization) element).getName();
                    break;
                case 1:
                    text = ((IVirtualOrganization) element).getTypeName();
                    break;
                }
            }
            return text;
        }

    }

    /**
     * The table viewer used to display the VOs.
     *   Package visibility to avoid warning about synthetic accessor
     *   performance issue.
     */
    CheckboxTableViewer voViewer;

    /**
     * The button that triggers the creation of a new VO.
     */
    private Button addButton;

    /**
     * The button that triggers the opening of the VO import wizard. 
     */
    private Button importButton;

    /**
     * The button that triggers the deletion of an existing VO.
     */
    private Button removeButton;

    /**
     * The button that triggers the editing of an existing VO.
     */
    private Button editButton;

    /**
     * Standard constructor for the VO preference page.
     */
    public VoPreferencePage() {
        super();
        setDescription(Messages.getString("VoPreferencePage.description")); //$NON-NLS-1$
    }

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

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(final IWorkbench workbench) {
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createContents(final Composite parent) {

        initializeDialogUnits(parent);
        noDefaultAndApplyButton();

        GridData gData;
        GridLayout layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        parent.setLayout(layout);

        Label voLabel = new Label(parent, SWT.NONE);
        voLabel.setText(Messages.getString("VoPreferencePage.vo_list_label")); //$NON-NLS-1$
        gData = new GridData();
        gData.horizontalSpan = 2;
        gData.grabExcessHorizontalSpace = true;
        voLabel.setLayoutData(gData);

        Table voTable = new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        voTable.setHeaderVisible(true);
        voTable.setLinesVisible(true);
        gData = new GridData(GridData.FILL_BOTH);
        gData.horizontalSpan = 1;
        gData.grabExcessHorizontalSpace = true;
        gData.grabExcessVerticalSpace = true;
        gData.widthHint = 200;
        gData.heightHint = 100;
        voTable.setLayoutData(gData);
        voTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDoubleClick(final MouseEvent e) {
                IVirtualOrganization selectedVo = getSelectedVo();
                if (selectedVo != null) {
                    editVO(selectedVo);
                }
            }
        });
        voTable.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(final KeyEvent event) {
                if (event.character == SWT.DEL && event.stateMask == 0) {
                    removeSelectedVOs();
                }
            }
        });

        TableColumn nameColumn = new TableColumn(voTable, SWT.LEFT);
        nameColumn.setText(Messages.getString("VoPreferencePage.name_column_text")); //$NON-NLS-1$
        nameColumn.setWidth(100);
        TableColumn typeColumn = new TableColumn(voTable, SWT.CENTER);
        typeColumn.setText(Messages.getString("VoPreferencePage.type_column_text")); //$NON-NLS-1$
        typeColumn.setWidth(100);

        final IVoManager manager = GridModel.getVoManager();
        this.voViewer = new CheckboxTableViewer(voTable);
        this.voViewer.setLabelProvider(new VoLabelProvider());
        this.voViewer.setContentProvider(new VoContentProvider());

        TableColumnListener columnListener = new TableColumnListener(this.voViewer);
        nameColumn.addSelectionListener(columnListener);
        typeColumn.addSelectionListener(columnListener);

        // Initially we sort the VOs by name, ascending
        voTable.setSortColumn(nameColumn);
        voTable.setSortDirection(SWT.UP);
        this.voViewer.setComparator(new TableColumnComparator(nameColumn));

        this.voViewer.setInput(manager);
        this.voViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(final SelectionChangedEvent event) {
                updateButtons();
            }
        });
        manager.addGridModelListener(this);
        IVirtualOrganization defaultVo = (IVirtualOrganization) manager.getDefault();
        if (defaultVo != null) {
            this.voViewer.setCheckedElements(new Object[] { defaultVo });
        }
        this.voViewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(final CheckStateChangedEvent event) {
                Object element = event.getElement();
                if (element instanceof IVirtualOrganization) {
                    IVirtualOrganization vo = (IVirtualOrganization) element;
                    try {
                        if (!event.getChecked()) {
                            manager.setDefault(null);
                        } else {
                            // We want a radio-button behavior, as there is only one default VO
                            VoPreferencePage.this.voViewer.setCheckedElements(new Object[] { vo });
                            VoPreferencePage.this.voViewer.refresh();
                            manager.setDefault(vo);
                        }
                    } catch (ProblemException pExc) {
                        // TODO mathias
                        Activator.logException(pExc);
                    }
                }
            }
        });

        Composite buttons = new Composite(parent, SWT.NULL);
        gData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
        gData.horizontalSpan = 1;
        buttons.setLayoutData(gData);
        GridLayout gLayout = new GridLayout(1, false);
        gLayout.marginHeight = 0;
        gLayout.marginWidth = 0;
        buttons.setLayout(gLayout);

        this.addButton = new Button(buttons, SWT.PUSH);
        this.addButton.setText(Messages.getString("VoPreferencePage.add_button")); //$NON-NLS-1$
        gData = new GridData(GridData.FILL_HORIZONTAL);
        this.addButton.setLayoutData(gData);
        this.importButton = new Button(buttons, SWT.PUSH);
        this.importButton.setText(Messages.getString("VoPreferencePage.import_button")); //$NON-NLS-1$
        gData = new GridData(GridData.FILL_HORIZONTAL);
        this.importButton.setLayoutData(gData);
        this.editButton = new Button(buttons, SWT.PUSH);
        this.editButton.setText(Messages.getString("VoPreferencePage.edit_button")); //$NON-NLS-1$
        gData = new GridData(GridData.FILL_HORIZONTAL);
        this.editButton.setLayoutData(gData);
        this.removeButton = new Button(buttons, SWT.PUSH);
        this.removeButton.setText(Messages.getString("VoPreferencePage.remove_button")); //$NON-NLS-1$
        gData = new GridData(GridData.FILL_HORIZONTAL);
        this.removeButton.setLayoutData(gData);

        Label separator = new Label(buttons, SWT.NONE);
        separator.setVisible(false);
        gData = new GridData();
        gData.horizontalAlignment = GridData.FILL;
        gData.heightHint = 4;
        separator.setLayoutData(gData);

        this.addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                editVO(null);
            }
        });
        this.importButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                importVOs();
            }
        });
        this.editButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                IVirtualOrganization selectedVo = getSelectedVo();
                if (selectedVo != null) {
                    editVO(selectedVo);
                }
            }
        });
        this.removeButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                removeSelectedVOs();
            }
        });

        updateButtons();

        return parent;

    }

    /**
     * Get the currently selected VO.
     * 
     * @return The VO that is currently selected in the table control.
     */
    public IVirtualOrganization getSelectedVo() {
        IVirtualOrganization selectedVo = null;
        IStructuredSelection selection = (IStructuredSelection) this.voViewer.getSelection();
        Object obj = selection.getFirstElement();
        if (obj instanceof IVirtualOrganization) {
            selectedVo = (IVirtualOrganization) obj;
        }
        return selectedVo;
    }

    /**
     * Get the currently selected VOs.
     * 
     * @return The VOs that are currently selected in the table control.
     */
    public List<IVirtualOrganization> getSelectedVos() {
        IStructuredSelection selection = (IStructuredSelection) this.voViewer.getSelection();
        List<?> selectionList = selection.toList();
        List<IVirtualOrganization> result = new ArrayList<IVirtualOrganization>();
        for (Object element : selectionList) {
            if (element instanceof IVirtualOrganization) {
                IVirtualOrganization vo = (IVirtualOrganization) element;
                result.add(vo);
            }
        }
        return result;
    }

    /**
     * Trigger the new VO wizard to pop up in order to create a new VO if vo
     * parameter is null or edit existing vo if vo parameter is specified.
     * 
     * @param vo To {@link IVirtualOrganization} to be edited. 
     */
    protected void editVO(final IVirtualOrganization vo) {
        URL imgUrl = Activator.getDefault().getBundle().getEntry("icons/wizban/vo_wiz.gif"); //$NON-NLS-1$
        Wizard wizard = new Wizard() {
            @Override
            public void addPages() {
                ExtPointWizardSelectionListPage page = new ExtPointWizardSelectionListPage("pagename", //$NON-NLS-1$
                        "eu.geclipse.ui.newVoWizards", //$NON-NLS-1$
                        Messages.getString("VoPreferencePage.create_new_vo"), //$NON-NLS-1$
                        Messages.getString("VoPreferencePage.create_new_vo_long"), //$NON-NLS-1$
                        Messages.getString("VoPreferencePage.no_vo_providers")); //$NON-NLS-1$
                page.setInitData(vo);
                if (vo != null) {
                    page.setPreselectedId(vo.getWizardId(), true);
                }
                addPage(page);
            }

            @Override
            public boolean performFinish() {
                return false;
            }
        };
        wizard.setForcePreviousAndNextButtons(true);
        wizard.setNeedsProgressMonitor(true);
        wizard.setWindowTitle(Messages.getString("VoPreferencePage.create_new_vo")); //$NON-NLS-1$
        wizard.setDefaultPageImageDescriptor(ImageDescriptor.createFromURL(imgUrl));
        WizardDialog dialog = new WizardDialog(this.getShell(), wizard);
        dialog.open();

        /*
         * If no VOs were present before calling the wizard, there is now a default
         * VO to mark as checked.
         */
        checkDefaultVo();

    }

    protected void importVOs() {
        VoImportWizard wizard;
        try {
            wizard = new VoImportWizard();
            WizardDialog dialog = new WizardDialog(getShell(), wizard);
            dialog.open();

            /*
             * If no VOs were present before importing, the VoManager will have set
             * the first new one as default. Thus we have to update the viewer's
             * checked element.
             */
            checkDefaultVo();
        } catch (ProblemException problemException) {
            ProblemDialog.openProblem(getShell(), Messages.getString("VoPreferencePage.couldNotOpenImportVoWizard"), //$NON-NLS-1$
                    Messages.getString("VoPreferencePage.couldNotOpenImportVoWizard"), //$NON-NLS-1$
                    problemException);
        }
    }

    /**
     * Remove all VOs that are currently selected in the table control.
     */
    protected void removeSelectedVOs() {

        List<IVirtualOrganization> vos = getSelectedVos();

        if (!vos.isEmpty()) {
            boolean confirm = MessageDialog.openConfirm(getShell(),
                    Messages.getString("VoPreferencePage.delete_vos"), //$NON-NLS-1$
                    Messages.getString("VoPreferencePage.really_delete_vos")); //$NON-NLS-1$
            if (confirm) {
                IGridElement[] projectElements = {};

                // Collect a list of children of the GridRoot
                try {
                    projectElements = GridModel.getRoot().getChildren(null);
                } catch (ProblemException pExc) {
                    // GridRoot is not a lazy container
                }

                IVoManager manager = GridModel.getVoManager();
                IGridProject igp = null;

                for (IVirtualOrganization vo : vos) {
                    // Check if the given VO is used by some GridProject on the WS
                    boolean used = false;
                    for (IGridElement element : projectElements) {
                        igp = (IGridProject) element;

                        // Projects have a ProjectVO wrapper, not the real VO
                        IVirtualOrganization realVo = null;
                        IVirtualOrganization projectVo = igp.getVO();
                        // HiddenProject doesn't have a VO
                        if (projectVo != null) {
                            realVo = (IVirtualOrganization) projectVo.getAdapter(IVirtualOrganization.class);
                            if ((realVo != null) && (vo == realVo)) {
                                used = true;
                                break;
                            }
                        }
                    }

                    if (used) {
                        MessageDialog.openError(this.getShell(), Messages.getString("VoPreferencePage.error"), //$NON-NLS-1$
                                String.format(Messages.getString("VoPreferencePage.vo_in_use"), //$NON-NLS-1$
                                        vo.getName(), igp.getName()));
                    } else {
                        try {
                            manager.delete(vo);
                        } catch (ProblemException pExc) {
                            ProblemDialog.openProblem(this.getShell(), Messages.getString("VoPreferencePage.error"), //$NON-NLS-1$
                                    Messages.getString("VoPreferencePage.delete_vo_failed") //$NON-NLS-1$
                                            + " " + vo.getName(), //$NON-NLS-1$
                                    pExc);
                        }
                    }
                }

                /*
                 * If the default VO was removed, another one was selected arbitrarily
                 * by the VoManager. So we have to update the viewer's checked element.
                 */
                checkDefaultVo();

                updateButtons();
            }
        }
    }

    /**
     * Mark the default VO checked in the voViewer table.
     */
    private void checkDefaultVo() {
        IVoManager manager = GridModel.getVoManager();
        if ((manager.getChildCount() > 0) && !this.voViewer.getControl().isDisposed()) {
            Object[] checked = new Object[] { manager.getDefault() };
            VoPreferencePage.this.voViewer.setCheckedElements(checked);
        }
    }

    /**
     * Update the enabled state of the button controls.
     */
    protected void updateButtons() {

        ISelection selection = this.voViewer.getSelection();
        boolean selectionAvailable = !selection.isEmpty();

        this.addButton.setEnabled(true);
        this.importButton.setEnabled(true);
        this.removeButton.setEnabled(selectionAvailable);
        this.editButton.setEnabled(selectionAvailable);

    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.IContentChangeListener#contentChanged(org.eclipse.compare.IContentChangeNotifier)
     */
    public void gridModelChanged(final IGridModelEvent source) {
        this.voViewer.refresh();
        IVoManager manager = GridModel.getVoManager();
        IGridElement defaultVo = manager.getDefault();
        if (defaultVo != null) {
            this.voViewer.setCheckedElements(new Object[] { defaultVo });
        }
        updateButtons();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        try {
            GridModel.getVoManager().saveElements();
        } catch (ProblemException pExc) {
            // TODO mathias
            Activator.logException(pExc);
        }
        return super.performOk();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
     */
    @Override
    protected void performDefaults() {
        try {
            GridModel.getVoManager().loadElements();
        } catch (ProblemException pExc) {
            // TODO mathias
            Activator.logException(pExc);
        }
        super.performDefaults();
    }

}