de.instanttouch.ui.scaffolding.swt.viewer.SnakeTableViewer.java Source code

Java tutorial

Introduction

Here is the source code for de.instanttouch.ui.scaffolding.swt.viewer.SnakeTableViewer.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Joachim Tessmer.
 * 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:
 *     Joachim Tessmer - initial API and implementation
 ******************************************************************************/
package de.instanttouch.ui.scaffolding.swt.viewer;

import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.ViewerFilter;
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.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.PlatformUI;

import de.instantouch.model.base.SnakeString;
import de.instantouch.model.base.SnakeType;
import de.instantouch.model.collections.SnakeEntity;
import de.instantouch.model.collections.SnakeList;
import de.instantouch.model.collections.SnakeMap;
import de.instantouch.model.exception.SnakeModelException;
import de.instantouch.model.exception.SnakeNotImplementedException;
import de.instantouch.model.exception.SnakeWrongTypeException;
import de.instanttouch.api.model.ISnakeModification;
import de.instanttouch.api.model.ISnakeTypeListener;
import de.instanttouch.ui.scaffolding.swt.action.SnakeAction;
import de.instanttouch.ui.scaffolding.swt.action.SnakeActionRegistry;
import de.instanttouch.ui.scaffolding.swt.action.SnakeOpenAction;
import de.instanttouch.ui.scaffolding.swt.error.SnakeExceptionHandler;
import de.instanttouch.ui.scaffolding.swt.extensions.SnakeDialogRegistry;

public class SnakeTableViewer extends TableViewer {

    protected SnakeType type = null;
    protected SnakeString pattern = null;

    protected SnakeAction doubleClickAction = new SnakeOpenAction("open type dialog");
    protected SnakeAction selectAction = null;
    private IContentProvider contentProvider = null;

    public SnakeTableViewer(Composite parent, int style, SnakeType type) throws SnakeModelException {

        super(parent, style);
        this.type = type;

        create(parent);
    }

    protected void create(Composite parent) throws SnakeModelException {

        Table table = getTable();

        if (type instanceof SnakeMap) {
            TableColumn column = new TableColumn(table, SWT.NONE);
            column.setWidth(20);
            column.setText("");
            column.setResizable(false);

            column = new TableColumn(table, SWT.NONE);
            column.setWidth(100);
            column.setText("key");
            column.setResizable(true);

            column = new TableColumn(table, SWT.NONE);
            column.setWidth(300);
            column.setText("value");
            column.setResizable(true);

        } else if (type instanceof SnakeList) {
            SnakeType innerType;
            try {
                innerType = ((SnakeList) type).newElement();

            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e2) {
                throw new SnakeModelException(e2.getMessage());
            }

            TableColumn column = new TableColumn(table, SWT.NONE);
            column.setWidth(20);
            column.setText("");
            column.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {

                    if (e.getSource() instanceof TableColumn) {
                        try {
                            sort((TableColumn) e.getSource());
                        } catch (SnakeModelException e1) {
                            SnakeExceptionHandler.handle(e1);
                        }
                    }
                }

            });

            if (innerType.handleAsBasic()) {
                column = new TableColumn(table, SWT.NONE);
                column.setWidth(300);
                column.setText(innerType.getName());
                column.setResizable(true);

            } else if (innerType instanceof SnakeEntity) {
                SnakeEntity entity = (SnakeEntity) innerType;

                if (!onlyBasicTypes(entity)) {
                    throw new SnakeWrongTypeException(
                            "entity: " + entity.getName() + " cannot be displaed in SnakeTableViewer");
                }

                for (SnakeType child : entity.getVisibleChildren()) {
                    column = new TableColumn(table, SWT.NONE);

                    double width = child.getConstraints().hasWidth() ? child.getConstraints().getWidth() : 100;
                    Double convert = new Double(width);
                    column.setWidth(convert.intValue());
                    column.setResizable(true);

                    column.setText(child.getName());
                    column.addSelectionListener(new SelectionAdapter() {

                        @Override
                        public void widgetSelected(SelectionEvent e) {

                            if (e.getSource() instanceof TableColumn) {
                                try {
                                    sort((TableColumn) e.getSource());
                                } catch (SnakeModelException e1) {
                                    SnakeExceptionHandler.handle(e1);
                                }
                            }
                        }

                    });

                    if (child instanceof SnakeString) {
                        SnakeString asString = (SnakeString) child;
                        if (asString.getConstraints().isLarge()) {
                            column.setWidth(250);
                        }

                    }

                }
            }

        }

        GridData layoutData = new GridData(GridData.FILL_BOTH);

        // layoutData.widthHint = 100;
        // layoutData.heightHint = 50;
        getControl().setLayoutData(layoutData);

        setLabelProvider(new SnakeTableLabelProvider());
        contentProvider = new SnakeStructuredContentProvider();
        setContentProvider(contentProvider);
        getTable().setLinesVisible(true);
        setInput(type);

        addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent event) {

                ISelection selection = event.getSelection();
                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    Object selected = structuredSelection.getFirstElement();
                    if (selected instanceof SnakeType) {
                        if (selected != getInput() && doubleClickAction != null) {
                            doubleClickAction.setInput((SnakeType) selected);
                            doubleClickAction.run();
                            refresh();
                        }
                    }

                }
            }
        });

        addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {

                ISelection selection = event.getSelection();
                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    Object selected = structuredSelection.getFirstElement();
                    if (selected instanceof SnakeType) {
                        if (selected != getInput() && selectAction != null) {
                            selectAction.setInput((SnakeType) selected);
                            selectAction.run();
                            refresh();
                        }
                    }

                }
            }
        });

        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        final IMenuListener menuListener = new IMenuListener() {

            @Override
            public void menuAboutToShow(IMenuManager manager) {
                final Object selected;
                if (getSelection() instanceof TreeSelection) {
                    selected = ((TreeSelection) getSelection()).getFirstElement();
                } else {
                    selected = null;
                }

                if (selected instanceof SnakeType) {
                    SnakeType type = (SnakeType) selected;
                    for (SnakeAction action : SnakeActionRegistry.getAllAvailableActions(type)) {
                        if (action.getTarget() != null) {
                            // todo check that workbenchpart matches
                        }
                        action.setInput(type);
                        manager.add(action);
                    }
                }

                manager.updateAll(true);

            }
        };

        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

            @Override
            public void run() {
                MenuManager menuManager = new MenuManager();
                menuManager.setRemoveAllWhenShown(true);
                Menu menu = menuManager.createContextMenu(getControl());
                getControl().setMenu(menu);

                menuManager.addMenuListener(menuListener);
            }
        });

    }

    public static boolean onlyBasicTypes(SnakeEntity struct) {

        boolean onlyBasic = true;
        for (SnakeType child : struct.getChildren()) {
            if (!child.handleAsBasic()) {
                onlyBasic = false;
                break;
            }
        }

        return onlyBasic;
    }

    protected void open(SnakeType type) {

        boolean bValidate = false;
        boolean allowOk = true;
        Dialog typeDialog = SnakeDialogRegistry.createForType(getTable().getShell(), type, allowOk, bValidate);
        if (typeDialog != null) {
            if (Dialog.OK == typeDialog.open()) {
                refresh();
            }
        }

    }

    public void setDoubleClickAction(SnakeAction doubleClickAction) {

        this.doubleClickAction = doubleClickAction;
    }

    public SnakeAction getSelectAction() {

        return selectAction;
    }

    public void setSelectAction(SnakeAction selectAction) {

        this.selectAction = selectAction;
    }

    @Override
    public void addFilter(final ViewerFilter filter) {

        if (filter instanceof SnakeViewerFilter) {
            final SnakeViewerFilter myFilter = (SnakeViewerFilter) filter;
            SnakeString pattern = myFilter.getPattern();
            if (pattern != null) {
                ISnakeTypeListener listener = new ISnakeTypeListener() {

                    @Override
                    public void onChange(ISnakeModification modification) {
                        refresh();
                    }

                };

                pattern.addListener(listener);
            }
        }

        super.addFilter(filter);
    }

    public SnakeViewerFilter getFilter(int index) {

        SnakeViewerFilter jdsiFilter = null;

        if (index < getFilters().length) {
            ViewerFilter filter = getFilters()[index];
            if (filter instanceof SnakeViewerFilter) {
                jdsiFilter = (SnakeViewerFilter) filter;
            }
        }

        return jdsiFilter;
    }

    @SuppressWarnings("unchecked")
    protected void sort(TableColumn column) throws SnakeModelException {

        int index = -1;

        if (type instanceof SnakeList) {
            for (int i = 0; i < getTable().getColumnCount(); i++) {
                TableColumn checkColumn = getTable().getColumn(i);
                if (checkColumn == column) {

                    index = i;
                    break;
                }
            }

            if (getTable().getSortColumn() == column) {
                int sortDirection = getTable().getSortDirection();
                sortDirection = sortDirection == SWT.UP ? SWT.DOWN : SWT.UP;
                getTable().setSortDirection(sortDirection);
            } else {
                getTable().setSortDirection(SWT.UP);
                getTable().setSortColumn(column);
            }
            if (contentProvider instanceof SnakeStructuredContentProvider) {
                SnakeStructuredContentProvider jdsiContentProvider = (SnakeStructuredContentProvider) contentProvider;

                if (index == 0) {
                    jdsiContentProvider.noSort();
                } else {

                    jdsiContentProvider.sortBy(column.getText(), getTable().getSortDirection());
                }
            }

            else {
                throw new SnakeNotImplementedException("implement sort in lazy Vector");
            }
            refresh();
        } else {
            throw new SnakeWrongTypeException("are any other types than list needed?");
        }

    }

    @Override
    protected Object[] filter(Object[] elements) {

        return super.filter(elements);
    }

    public SnakeType getFirstSelected() {

        SnakeType selected = null;

        ISelection selection = getSelection();
        if (selection instanceof IStructuredSelection) {
            Object type = ((IStructuredSelection) selection).getFirstElement();
            if (type instanceof SnakeType) {
                selected = (SnakeType) type;
            }
        }

        return selected;
    }

}