org.splevo.jamopp.refactoring.java.caslicensehandler.cheatsheet.actions.MappingDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.splevo.jamopp.refactoring.java.caslicensehandler.cheatsheet.actions.MappingDialog.java

Source

package org.splevo.jamopp.refactoring.java.caslicensehandler.cheatsheet.actions;

import java.util.List;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;
import org.splevo.vpm.variability.Variant;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;

/**
 * The user can assign a variant to a given license with the mapping dialog.
 */
public class MappingDialog extends TitleAreaDialog {

    public static final int DATA_INCOMPLETE = 3;

    private List<Variant> variants;
    private CASLicenseHandlerConfiguration config;
    private ComboBoxViewerCellEditor cellEditor;

    /**
     * The constructor.
     * 
     * @param parentShell
     *            represents the parent shell.
     */
    public MappingDialog(Shell parentShell) {
        super(parentShell);
        this.config = CASLicenseHandlerConfiguration.getInstance();
        this.variants = config.getVariationPoint().getVariants();
    }

    @Override
    public void create() {
        super.create();
        setTitle("License Mapping Dialog");
        setMessage("Please assign a license constant to every variant.");
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);

        GridLayout gridLayout = new GridLayout(1, false);
        container.setLayout(gridLayout);

        TableLayout tableLayout = new TableLayout();
        tableLayout.addColumnData(new ColumnWeightData(1));
        tableLayout.addColumnData(new ColumnWeightData(1));

        final Table table = new Table(container,
                SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION | SWT.HIDE_SELECTION | SWT.V_SCROLL);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.setLayout(tableLayout);

        final TableViewer tableViewer = new TableViewer(table);
        tableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        TableViewerColumn labelColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        labelColumn.getColumn().setText("Variant");

        TableViewerColumn valueColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        valueColumn.getColumn().setText("License Constant");

        EditingSupport exampleEditingSupport = new TableEditingSupport(valueColumn.getViewer());
        valueColumn.setEditingSupport(exampleEditingSupport);

        tableViewer.setContentProvider(new ArrayContentProvider());
        tableViewer.setLabelProvider(new VariantTableLabelProvider());
        tableViewer.setInput(variants);

        Button newLicense = new Button(container, SWT.PUSH);
        newLicense.setText("Create New License Constant");
        newLicense.addMouseListener(new MouseListener() {

            @Override
            public void mouseUp(MouseEvent e) {
                AddLicenseDialog dialog = new AddLicenseDialog(getShell());
                if (dialog.open() == Window.OK) {
                    cellEditor.setInput(config.getAllLicenses());
                }
            }

            @Override
            public void mouseDown(MouseEvent e) {
            }

            @Override
            public void mouseDoubleClick(MouseEvent e) {
            }
        });

        return container;
    }

    /**
     * Provides table with labels for each column.
     */
    private final class VariantTableLabelProvider extends LabelProvider implements ITableLabelProvider {

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

        @Override
        public String getColumnText(Object element, int columnIndex) {
            if (!(element instanceof Variant)) {
                return "";
            }
            Variant data = (Variant) element;
            switch (columnIndex) {
            case 0:
                return data.getId();
            case 1:
                if (getLicenseConstantName(data.getId()) == null) {
                    return "Please select...";
                }
                return getLicenseConstantName(data.getId());
            default:
                return "";
            }
        }
    }

    /**
     * Supports the table with cell editing.
     */
    private final class TableEditingSupport extends EditingSupport {

        private TableEditingSupport(ColumnViewer viewer) {
            super(viewer);
            cellEditor = new ComboBoxViewerCellEditor((Composite) getViewer().getControl(), SWT.READ_ONLY);
            cellEditor.setLabelProvider(new LabelProvider());
            cellEditor.setContentProvider(new ArrayContentProvider());
            cellEditor.setInput(config.getAllLicenses());
            cellEditor.setActivationStyle(ComboBoxViewerCellEditor.DROP_DOWN_ON_KEY_ACTIVATION
                    | ComboBoxViewerCellEditor.DROP_DOWN_ON_MOUSE_ACTIVATION
                    | ComboBoxViewerCellEditor.DROP_DOWN_ON_PROGRAMMATIC_ACTIVATION
                    | ComboBoxViewerCellEditor.DROP_DOWN_ON_TRAVERSE_ACTIVATION);
            CASLicenseHandlerConfiguration.getInstance().getVariantToLicenseMap().clear();
        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            return cellEditor;
        }

        @Override
        protected boolean canEdit(Object element) {
            return true;
        }

        @Override
        protected Object getValue(Object element) {
            if (!(element instanceof Variant)) {
                return null;
            }
            return getLicenseConstantName(((Variant) element).getId());
        }

        @Override
        protected void setValue(Object element, Object value) {
            if (element instanceof Variant && value instanceof String) {
                Variant data = (Variant) element;
                String license = (String) value;
                if (!config.addVariantLicensePair(data.getId(), license)) {
                    MessageDialog.openInformation(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
                            "Information", "Every variant needs a different License Constant.");
                }
                getViewer().update(element, null);
            }
        }
    }

    @Override
    protected Point getInitialSize() {
        return new Point(450, 300);
    }

    @Override
    public boolean close() {
        if (getReturnCode() == Window.OK && !Iterables.all(variants, new Predicate<Variant>() {
            @Override
            public boolean apply(Variant input) {
                return getLicenseConstantName(input.getId()) != null;
            }
        })) {
            setReturnCode(DATA_INCOMPLETE);
        }
        return super.close();
    }

    private String getLicenseConstantName(String variantId) {
        return config.getVariantToLicenseMap().get(variantId);
    }
}