ac.soton.fmusim.components.ui.controls.EditableTableViewerContainer.java Source code

Java tutorial

Introduction

Here is the source code for ac.soton.fmusim.components.ui.controls.EditableTableViewerContainer.java

Source

/**
 * Copyright (c) 2013 University of Southampton.
 * 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
 */
package ac.soton.fmusim.components.ui.controls;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
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.Listener;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import org.eclipse.ui.dialogs.SelectionDialog;

import ac.soton.fmusim.components.ui.providers.ColumnProvider;
import ac.soton.fmusim.components.ui.providers.SelectionDialogProvider;

/**
 * Table viewer container with Add and Remove buttons for editing the table.
 * 
 * @author vitaly
 *
 */
public class EditableTableViewerContainer extends TableViewerContainer {

    private Composite plate;
    private List<?> inputSource;
    int idColumnIndex;
    private Button addButton;
    private Button removeButton;
    private Listener changeListener;
    private SelectionDialogProvider dialogProvider;
    private boolean enabled;

    /**
     * Contructor.
     * @param viewer
     */
    public EditableTableViewerContainer(TableViewer viewer) {
        super(viewer);

        // swap table parent to composite
        Composite parent = tableViewer.getTable().getParent();
        plate = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        plate.setLayout(layout);
        tableViewer.getTable().setParent(plate);
        tableViewer.getTable().setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));

        // buttons
        Composite buttonPlate = new Composite(plate, SWT.NONE);
        GridLayout buttonLayout = new GridLayout(1, false);
        buttonPlate.setLayout(buttonLayout);

        addButton = new Button(buttonPlate, SWT.PUSH);
        addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        addButton.setText("Add");
        addButton.addSelectionListener(new SelectionAdapter() {

            @SuppressWarnings("unchecked")
            @Override
            public void widgetSelected(SelectionEvent e) {
                // remember selection
                int idx = tableViewer.getTable().getSelectionIndex();

                // select elements to add
                SelectionDialog selectionDialog = getSelectionDialog();
                //            eventsDialog.setTitle(machine.getName() + " Events");
                //            eventsDialog.setMessage("Please select events for this transition to elaborate");
                if (Dialog.OK == selectionDialog.open()) {
                    Object[] result = selectionDialog.getResult();
                    if (result != null) {
                        List<Object> newElements = new ArrayList<Object>();
                        for (Object obj : result)
                            newElements.add(obj);

                        Object input = tableViewer.getInput();
                        ((List<Object>) input).addAll(newElements);
                        tableViewer.refresh();

                        // restore selection
                        if (idx >= 0) {
                            tableViewer.getTable().select(idx);
                            tableViewer.getTable().notifyListeners(SWT.Selection,
                                    new org.eclipse.swt.widgets.Event());
                        }

                        // notify about the change
                        notifyChanged();
                    }
                }
            }
        });

        removeButton = new Button(buttonPlate, SWT.PUSH);
        removeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        removeButton.setText("Remove");
        removeButton.setEnabled(false);
        removeButton.addSelectionListener(new SelectionAdapter() {

            @SuppressWarnings("rawtypes")
            @Override
            public void widgetSelected(SelectionEvent e) {
                ISelection selection = tableViewer.getSelection();
                if (selection != null && selection instanceof IStructuredSelection) {
                    IStructuredSelection sel = (IStructuredSelection) selection;
                    List input = (List) tableViewer.getInput();
                    for (Iterator it = sel.iterator(); it.hasNext();) {
                        Object element = it.next();
                        input.remove(element);
                    }

                    // refresh table and buttons
                    tableViewer.refresh();
                    removeButton.setEnabled(false);

                    // notify about the change
                    notifyChanged();
                }
            }
        });

        // button enabling behaviour based on the table state
        tableViewer.getTable().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                removeButton.setEnabled(true);
            }
        });

        buttonPlate.setLayoutData(new GridData(GridData.FILL_VERTICAL));

        enabled = true;
    }

    /**
     * Creates table columns from the column providers.
     * 
     * @param columnProviders list of column providers
     * @param idColumnIndex index of ID column provider, also used when selecting new elements
     */
    public void setColumnProviders(List<ColumnProvider> columnProviders, int idColumnIndex) {
        super.setColumnProviders(columnProviders);

        assert idColumnIndex >= 0 && idColumnIndex < columnProviders.size();
        this.idColumnIndex = idColumnIndex;
    }

    /**
     * Returns input source for the default implementation of getSelectionDialog(),
     * which allows to add elements from this source to the table.
     * 
     * @return
     */
    protected List<?> getInputSource() {
        return inputSource;
    }

    /**
     * Returns input label provider for the default implementation of getSelectionDialog().
     * @return
     */
    protected ILabelProvider getInputLabelProvider() {
        // if column providers defined, use ID provider (default is 0, if not set)
        if (columnProviders != null)
            return (ILabelProvider) columnProviders.get(idColumnIndex).getLabelProvider();

        // or use default label provider
        return new LabelProvider();
    }

    /**
     * Sets layout data for the button table viewer.
     * 
     * @param layoutData
     */
    public void setLayoutData(Object layoutData) {
        plate.setLayoutData(layoutData);
    }

    /**
     * Sets table viewer input.
     * 
     * @param source input source (can be null if a selection dialog is used as element source)
     * @param input current table content
     */
    public void setInput(List<?> source, Object input) {
        super.setInput(input);
        inputSource = source;
    }

    /**
     * Sets table listener that will be notified
     * about the changes of the table content.
     * 
     * @param listener
     */
    public void setChangeListener(Listener listener) {
        changeListener = listener;
    }

    /**
     * @param dialog
     */
    public void setSelectionDialogProvider(SelectionDialogProvider provider) {
        dialogProvider = provider;
    }

    /**
     * Returns selection dialog, used when pressing Add button to add elements to the table.
     * If selection dialog provider is not set, by default a ListSelectionDialog is returned,
     * Override or set dialog provider via setSelectionDialogProvider() if custom dialog is required.
     * 
     * @return
     */
    protected SelectionDialog getSelectionDialog() {
        if (dialogProvider == null) {
            return new ListSelectionDialog(tableViewer.getControl().getShell(), getInputSource(),
                    new ArrayContentProvider(), getInputLabelProvider(), null);
        }
        return dialogProvider.getDialog();
    }

    /**
     * Notifies registered change listener if table content has changed.
     */
    protected void notifyChanged() {
        if (changeListener != null)
            changeListener.handleEvent(null);
    }

    /**
     * Sets enabled status of table elements.
     * 
     * @param enabled
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
        tableViewer.getTable().setEnabled(enabled);
        addButton.setEnabled(enabled);
        removeButton.setEnabled(enabled);
    }

    /**
     * Returns enabled status of the table.
     * 
     * @return
     */
    public boolean isEnabled() {
        return enabled;
    }
}