org.eclipse.reqcycle.ui.collectionspropseditor.internal.components.CollectionsPropsEditorComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.reqcycle.ui.collectionspropseditor.internal.components.CollectionsPropsEditorComponent.java

Source

/*****************************************************************************
 * Copyright (c) 2013 AtoS.
 *
 *    
 * 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
 *
 * Contributors:
 *  Papa Issa DIAKHATE (AtoS) papa-issa.diakhate@atos.net - Initial API and implementation
 *  Anass RADOUANI (Atos) anass.radouani@atos.net - Use Literal Value for EEnumLiterals
 *
 *****************************************************************************/
package org.eclipse.reqcycle.ui.collectionspropseditor.internal.components;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.reqcycle.ui.eattrpropseditor.api.AbstractPropsEditorComponent;
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.FillLayout;
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.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

public class CollectionsPropsEditorComponent extends AbstractPropsEditorComponent<Collection<Object>> {

    private TableViewer tableViewer;

    private final List<Object> enteredValues = new ArrayList<Object>();

    private final CustomViewerComparator comparator;

    public CollectionsPropsEditorComponent(EAttribute attribute, Composite parent, int style) {

        super(attribute, parent, style);

        final Label lblName = new Label(this, SWT.NONE);
        lblName.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false, 1, 1));
        lblName.setText(attribute.getName());

        final EClassifier eType = attribute.getEType();

        if (eType instanceof EEnum) {
            setLayout(new GridLayout(2, false));
            this.initTableViewerForEEnum(parent, (EEnum) eType);

        } else {
            setLayout(new GridLayout(4, false));
            this.initSimpleTableViewer(parent);
        }

        tableViewer.setLabelProvider(new DefaultTableLabelProvider());
        this.comparator = new CustomViewerComparator();
        tableViewer.setComparator(comparator);

        final Table table = tableViewer.getTable();

        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        table.setSize(200, 0);

        final TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        tableViewerColumn.setLabelProvider(new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                Object obj = cell.getElement();
                if (obj instanceof ItemValue) {
                    cell.setText(obj.toString());
                } else if (obj instanceof Enumerator) {
                    cell.setText(((Enumerator) obj).getLiteral());
                } else {
                    throw new IllegalArgumentException("Cannot update the cell label, unknown content type ...");
                }
            }
        });
        tableViewerColumn.setEditingSupport(new ItemValueEditingSupport(tableViewer));

        final TableColumn valuesColumn = tableViewerColumn.getColumn();
        valuesColumn.setText("values");
        valuesColumn.setResizable(true);
        valuesColumn.setMoveable(true);
        valuesColumn.setWidth(table.getSize().x);
        valuesColumn.addSelectionListener(getSelectionAdapter(valuesColumn));
    }

    private void initSimpleTableViewer(final Composite parent) {

        tableViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
        tableViewer.setContentProvider(ArrayContentProvider.getInstance());
        tableViewer.setInput(this.enteredValues);

        this.initTableMenu(this.tableViewer.getTable());

        Composite buttonsComposite = new Composite(this, SWT.NONE);
        buttonsComposite.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false, 1, 1));
        buttonsComposite.setLayout(new FillLayout(SWT.VERTICAL));

        Button btnAdd = new Button(buttonsComposite, SWT.NONE);
        btnAdd.setText("Add");
        btnAdd.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                addNewItem();
            }
        });

        Button btnDelete = new Button(buttonsComposite, SWT.NONE);
        btnDelete.setText("Delete");
        btnDelete.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                removeSelectedItems();
            }
        });
    }

    private void initTableViewerForEEnum(Composite parent, EEnum eType) {
        tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.MULTI);
        Table table = tableViewer.getTable();
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        tableViewer.setContentProvider(new IStructuredContentProvider() {

            @Override
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public Object[] getElements(Object inputElement) {
                return (Object[]) inputElement;
            }
        });
        ((CheckboxTableViewer) tableViewer).addCheckStateListener(new ICheckStateListener() {

            @Override
            public void checkStateChanged(CheckStateChangedEvent event) {
                Object obj = event.getElement();
                if (obj instanceof EEnumLiteral) {
                    if (event.getChecked()) {
                        enteredValues.add(((EEnumLiteral) obj).getInstance());
                    } else {
                        enteredValues.remove(((EEnumLiteral) obj).getInstance());
                    }
                }
            }
        });
        tableViewer.setInput(eType.getELiterals().toArray());
    }

    private void initTableMenu(final Table table) {
        Menu menu = new Menu(table);
        table.setMenu(menu);

        MenuItem menuItemAdd = new MenuItem(menu, SWT.NONE);
        menuItemAdd.setText("Add");
        menuItemAdd.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                addNewItem();
            }
        });

        MenuItem menuItemRemove = new MenuItem(menu, SWT.NONE);
        menuItemRemove.setText("Remove");
        menuItemRemove.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                removeSelectedItems();
            }
        });
    }

    private void addNewItem() {
        ItemValue<?> newValue = new CharSequenceValue("<enter a value>");
        this.enteredValues.add(newValue);
        this.tableViewer.refresh();
    }

    private void removeSelectedItems() {
        Table t = tableViewer.getTable();
        for (int i : t.getSelectionIndices()) {
            Object obj = tableViewer.getElementAt(i);
            this.enteredValues.remove(obj);
        }
        tableViewer.refresh();
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Collection<Object> getValue() {
        Collection<Object> result = new ArrayList<Object>();
        for (Object item : this.enteredValues) {
            if (item instanceof ItemValue) {
                result.add(((ItemValue) item).getValue());
            } else if (item instanceof EEnumLiteral) {
                result.add(((EEnumLiteral) item).getLiteral());
            } else {
                result.add(item);
            }
        }
        return result;
    }

    @Override
    public boolean isValid() {
        return true;
    }

    private SelectionAdapter getSelectionAdapter(final TableColumn column) {
        SelectionAdapter selectionAdapter = new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                comparator.changeOrder();
                int dir = comparator.getDirection();
                tableViewer.getTable().setSortDirection(dir);
                tableViewer.getTable().setSortColumn(column);
                tableViewer.refresh();
            }
        };
        return selectionAdapter;
    }

    private class DefaultTableLabelProvider implements ITableLabelProvider {

        @Override
        public void removeListener(ILabelProviderListener listener) {
        }

        @Override
        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        @Override
        public void dispose() {
        }

        @Override
        public void addListener(ILabelProviderListener listener) {
        }

        @Override
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof EEnumLiteral) {
                return ((EEnumLiteral) element).getLiteral();
            }
            return element.toString();
        }

        @Override
        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }
    }

    private class CustomViewerComparator extends ViewerComparator {

        private static final int DESCENDING = 1;

        private int direction = DESCENDING;

        public CustomViewerComparator() {
            direction = DESCENDING;
        }

        public int getDirection() {
            return direction == 1 ? SWT.DOWN : SWT.UP;
        }

        public void changeOrder() {
            // we only have one column.
            direction = 1 - direction;
        }

        @Override
        public int compare(Viewer viewer, Object e1, Object e2) {

            int rc = 0;

            if (e1 instanceof EEnumLiteral && e2 instanceof EEnumLiteral) {
                rc = ((EEnumLiteral) e1).getLiteral().compareTo(((EEnumLiteral) e2).getLiteral());
            } else {
                rc = super.compare(viewer, e1, e2);
            }

            // If descending order, flip the direction
            if (direction == DESCENDING) {
                rc = -rc;
            }
            return rc;
        }
    }
}