com.archimatetool.editor.ui.dialog.RelationshipsMatrixDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.archimatetool.editor.ui.dialog.RelationshipsMatrixDialog.java

Source

/**
 * This program and the accompanying materials
 * are made available under the terms of the License
 * which accompanies this distribution in the file LICENSE.txt
 */
package com.archimatetool.editor.ui.dialog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.nebula.jface.gridviewer.GridTableViewer;
import org.eclipse.nebula.jface.gridviewer.internal.CellSelection;
import org.eclipse.nebula.widgets.grid.GridColumn;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

import com.archimatetool.editor.ui.ArchimateLabelProvider;
import com.archimatetool.editor.ui.IArchimateImages;
import com.archimatetool.editor.ui.components.ExtendedTitleAreaDialog;
import com.archimatetool.model.IArchimatePackage;
import com.archimatetool.model.util.ArchimateModelUtils;
import com.archimatetool.model.util.RelationshipsMatrix;
import com.archimatetool.model.util.RelationshipsMatrix.TargetMatrix;

/**
 * Relationships matrix Dialog
 * 
 * @author Phillip Beauvoir
 */
public class RelationshipsMatrixDialog extends ExtendedTitleAreaDialog {

    private static String HELP_ID = "com.archimatetool.help.RelationshipsMatrixDialog"; //$NON-NLS-1$

    private List<EClass> fAllClasses;

    public RelationshipsMatrixDialog(Shell parentShell) {
        super(parentShell, "RelationshipsMatrixDialog"); //$NON-NLS-1$
        setTitleImage(IArchimateImages.ImageFactory.getImage(IArchimateImages.ECLIPSE_IMAGE_NEW_WIZARD));
        setShellStyle(getShellStyle() | SWT.RESIZE);
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.RelationshipsMatrixDialog_0);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        // Help
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, HELP_ID);

        setTitle(Messages.RelationshipsMatrixDialog_0);
        setMessage(Messages.RelationshipsMatrixDialog_1);
        Composite composite = (Composite) super.createDialogArea(parent);

        Composite client = new Composite(composite, SWT.NULL);
        GridLayout layout = new GridLayout(2, false);
        client.setLayout(layout);
        client.setLayoutData(new GridData(GridData.FILL_BOTH));

        GridData gd;

        GridTableViewer viewer = new GridTableViewer(client);
        gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 800;
        gd.heightHint = 500;
        viewer.getControl().setLayoutData(gd);

        viewer.getGrid().setHeaderVisible(true);
        viewer.getGrid().setRowHeaderVisible(true);
        viewer.getGrid().setRowsResizeable(true);
        viewer.getGrid().setCellSelectionEnabled(true);

        //viewer.setColumnProperties(new String[] {"1", "2", "3"});

        viewer.setRowHeaderLabelProvider(new CellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                cell.setText(ArchimateLabelProvider.INSTANCE.getDefaultName((EClass) cell.getElement()));
                cell.setImage(ArchimateLabelProvider.INSTANCE.getImage(cell.getElement()));
            }
        });

        for (EClass eClass : getData()) {
            GridColumn column = new GridColumn(viewer.getGrid(), SWT.NONE);
            column.setWidth(70);
            column.setImage(ArchimateLabelProvider.INSTANCE.getImage(eClass));
            column.setHeaderTooltip(ArchimateLabelProvider.INSTANCE.getDefaultName(eClass));
        }

        viewer.setContentProvider(new IStructuredContentProvider() {
            @Override
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public Object[] getElements(Object inputElement) {
                return getData().toArray();
            }
        });

        viewer.setLabelProvider(new MyLabelProvider());

        //hookContextMenu(viewer);

        viewer.setInput(getData());

        String text = ""; //$NON-NLS-1$
        for (Entry<EClass, Character> entry : RelationshipsMatrix.INSTANCE.getRelationshipsValueMap().entrySet()) {
            text += entry.getValue() + ": " + ArchimateLabelProvider.INSTANCE.getDefaultShortName(entry.getKey()) //$NON-NLS-1$
                    + "\n"; //$NON-NLS-1$
        }
        Label label = new Label(client, SWT.NULL);
        label.setText(text);
        label.setLayoutData(new GridData(SWT.TOP, SWT.TOP, false, true));

        return composite;
    }

    @SuppressWarnings("unused")
    private void hookContextMenu(final GridTableViewer viewer) {
        MenuManager menuMgr = new MenuManager("#GridPopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);

        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                final CellSelection selection = ((CellSelection) viewer.getSelection());
                if (!selection.isEmpty()) {
                    manager.add(new Action("Restore to default") { //$NON-NLS-1$
                        @Override
                        public void run() {
                            for (Object element : selection.toArray()) {
                                EClass eClassRow = (EClass) element;
                                for (Object o : selection.getIndices(element)) {
                                    int columnIndex = (Integer) o;
                                    EClass eClassColumn = getData().get(columnIndex);
                                    restoreDefaultValue(eClassRow, eClassColumn);
                                }
                            }
                        };
                    });
                }
            }
        });

        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
    }

    private void restoreDefaultValue(EClass sourceClass, EClass targetClass) {
        //Map<EClass, List<TargetMatrix>> matrixMap = RelationshipsMatrix.INSTANCE.getRelationshipsMatrix();

    }

    private List<EClass> getData() {
        if (fAllClasses == null) {
            fAllClasses = new ArrayList<EClass>();
            fAllClasses.addAll(Arrays.asList(ArchimateModelUtils.getAllArchimateClasses()));
            fAllClasses.add(IArchimatePackage.eINSTANCE.getJunction());
        }

        return fAllClasses;
    }

    private class MyLabelProvider extends LabelProvider implements ITableLabelProvider {

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

        @Override
        public String getColumnText(Object element, int columnIndex) {
            EClass eClassRow = (EClass) element;
            EClass eClassColumn = getData().get(columnIndex);

            String text = ""; //$NON-NLS-1$

            Map<EClass, List<TargetMatrix>> matrixMap = RelationshipsMatrix.INSTANCE.getRelationshipsMatrix();
            Map<EClass, Character> valueMap = RelationshipsMatrix.INSTANCE.getRelationshipsValueMap();

            List<TargetMatrix> list = matrixMap.get(eClassRow);
            if (list != null) {
                for (TargetMatrix targetMatrix : list) {
                    if (targetMatrix.getTargetClass() == eClassColumn) {
                        for (EClass relation : targetMatrix.getRelationships()) {
                            text += valueMap.get(relation);
                        }
                        break;
                    }
                }
            }

            return text;
        }
    }

    @Override
    protected Point getDefaultDialogSize() {
        return new Point(1000, 700);
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        // create OK button
        createButton(parent, IDialogConstants.OK_ID, Messages.RelationshipsMatrixDialog_2, true);
    }

}