de.instanttouch.ui.scaffolding.swt.presenter.SnakeListPresenter.java Source code

Java tutorial

Introduction

Here is the source code for de.instanttouch.ui.scaffolding.swt.presenter.SnakeListPresenter.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.presenter;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
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.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.Shell;
import org.eclipse.ui.PlatformUI;

import de.instantouch.model.base.SnakeString;
import de.instantouch.model.base.SnakeType;
import de.instantouch.model.base.ref.SnakeOption;
import de.instantouch.model.base.ref.SnakeTypeSelectionCreator;
import de.instantouch.model.collections.SnakeEntity;
import de.instantouch.model.collections.SnakeList;
import de.instantouch.model.exception.SnakeModelException;
import de.instantouch.model.log.SnakeLog;
import de.instanttouch.api.model.ISnakeModification;
import de.instanttouch.ui.scaffolding.swt.Activator;
import de.instanttouch.ui.scaffolding.swt.dialog.SnakeDialog;
import de.instanttouch.ui.scaffolding.swt.dialog.SnakeSelectTypeDialog;
import de.instanttouch.ui.scaffolding.swt.error.SnakeExceptionHandler;
import de.instanttouch.ui.scaffolding.swt.extensions.SnakeDialogRegistry;
import de.instanttouch.ui.scaffolding.swt.viewer.SnakeScrolledComposite;
import de.instanttouch.ui.scaffolding.swt.viewer.SnakeTableViewer;
import de.instanttouch.ui.scaffolding.swt.viewer.SnakeViewerFilter;

public class SnakeListPresenter<T extends SnakeType> extends SnakePresenter {

    protected SnakeList<T> list = null;
    private ListViewer elements = null;
    private SnakeTableViewer tableViewer = null;
    protected boolean allowOk = true;
    private boolean bValidate = false;

    protected IDoubleClickListener doubleClickListener;

    public SnakeListPresenter(Composite parent, int style, SnakeList<T> list, boolean allowOk) {

        super(parent, style, list);

        this.list = list;
        this.allowOk = allowOk;
    }

    @Override
    public void init(Object layoutData, boolean bValidate) {

        this.bValidate = bValidate;

        composite.setLayoutData(layoutData);
        composite.setLayout(new GridLayout(6, false));

        Label label = new Label(composite, SWT.NONE);
        label.setText(list.getName());
        String desc = type.getConstraints().getDescription();
        if (desc != null) {
            label.setToolTipText(desc);
        }

        GridData labelLayoutData = new GridData();
        // labelLayoutData.widthHint = 100;
        label.setLayoutData(labelLayoutData);

        if (type.getConstraints().isEnabled()) {
            Button configure = new Button(composite, SWT.PUSH);

            String path = "icons/add.png";
            Image image = Activator.getImage(path);
            configure.setImage(image);
            configure.setText("add");
            configure.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {

                    add();
                }

            });

            Button delete = new Button(composite, SWT.PUSH);

            path = "icons/delete.png";
            image = Activator.getImage(path);
            delete.setImage(image);
            delete.setText("del");
            delete.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent event) {

                    ISelection selection = tableViewer != null ? tableViewer.getSelection()
                            : elements.getSelection();
                    if (selection instanceof IStructuredSelection) {
                        IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                        Object selected = structuredSelection.getFirstElement();
                        if (selected instanceof SnakeType) {
                            T type = (T) selected;
                            list.remove(type);
                            refresh();
                        }

                    }
                }

            });

            String count = "(" + list.size() + " elements)";
            label = new Label(composite, SWT.NONE);
            label.setText(count);
            desc = type.getConstraints().getDescription();
            if (desc != null) {
                label.setToolTipText(desc);
            }

        }

        boolean tableCanBeUsed = false;
        try {
            SnakeType innerType = list.newElement();
            if (innerType != null && innerType.handleAsBasic()) {
                tableCanBeUsed = true;
            } else if (innerType instanceof SnakeEntity) {
                tableCanBeUsed = SnakeTableViewer.onlyBasicTypes((SnakeEntity) innerType);
            }
        } catch (Exception e) {
            SnakeLog.log(e);
        }

        GridData listLayoutData = new GridData(GridData.FILL_BOTH);

        listLayoutData.widthHint = 200;
        listLayoutData.heightHint = 100;
        listLayoutData.horizontalSpan = 6;

        if (tableCanBeUsed) {
            try {
                boolean matchName = true;
                SnakeViewerFilter filter = new SnakeViewerFilter(new SnakeString("filter pattern"), matchName);
                SnakeComposite filterComposite;
                try {
                    filterComposite = filter.createComposite(composite);
                    GridData gridData = new GridData();
                    // gridData.widthHint = 250;

                    filterComposite.setLayoutData(gridData);
                } catch (SnakeModelException e) {
                    SnakeExceptionHandler.handle(e);
                }

                SnakeScrolledComposite scrolledComposite = new SnakeScrolledComposite(composite, SWT.NONE);
                scrolledComposite.setLayout(new GridLayout(6, false));
                scrolledComposite.setLayoutData(listLayoutData);

                tableViewer = new SnakeTableViewer(scrolledComposite,
                        SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION, list);

                tableViewer.getTable().setLayoutData(listLayoutData);
                tableViewer.addFilter(filter);

                tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {

                    @Override
                    public void selectionChanged(SelectionChangedEvent event) {
                        selectOption(event);
                    }
                });

                scrolledComposite.setContent(tableViewer.getTable());
            } catch (SnakeModelException e) {
                SnakeLog.warning("failed creating SnakeTableViewer for list:" + list.getClass().getCanonicalName());
            }
        }
        if (!tableCanBeUsed || tableViewer == null) {

            elements = new ListViewer(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);

            elements.getControl().setLayoutData(listLayoutData);

            elements.setLabelProvider(new LabelProvider() {

                @Override
                public Image getImage(Object element) {

                    // TODO Auto-generated method stub
                    return super.getImage(element);
                }

                @Override
                public String getText(Object element) {

                    if (element instanceof SnakeType) {
                        SnakeType type = (SnakeType) element;
                        return /*
                               * TODO really needed ? type.getName() +
                               * ", value= " +
                               */type.toString();
                    }
                    return super.getText(element);
                }
            });
            elements.setContentProvider(new IStructuredContentProvider() {

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

                    // TODO Auto-generated method stub

                }

                @Override
                public void dispose() {

                    // TODO Auto-generated method stub

                }

                @Override
                public Object[] getElements(Object inputElement) {

                    return list.all().toArray();
                }
            });
            elements.setInput(list);

            elements.addSelectionChangedListener(new ISelectionChangedListener() {

                @Override
                public void selectionChanged(SelectionChangedEvent event) {
                    selectOption(event);
                }

            });

            elements.addDoubleClickListener(new IDoubleClickListener() {

                @Override
                public void doubleClick(DoubleClickEvent event) {

                    if (list instanceof SnakeOption) {

                        SnakeDialog snakeDialog = getDialog();
                        if (snakeDialog != null) {
                            snakeDialog.close();
                        }

                    } else {

                        ISelection selection = event.getSelection();
                        if (selection instanceof IStructuredSelection) {
                            IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                            Object selected = structuredSelection.getFirstElement();

                            if (selected instanceof SnakeType) {
                                SnakeType type = (SnakeType) selected;
                                open(type);
                            }

                        }
                    }
                }
            });
        }
    }

    protected void open(SnakeType type) {

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

    }

    protected void add() {

        try {

            // create element
            if (list.getElementCreator() instanceof SnakeTypeSelectionCreator) {
                SnakeTypeSelectionCreator creator = (SnakeTypeSelectionCreator) list.getElementCreator();

                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
                SnakeSelectTypeDialog selectDialog = new SnakeSelectTypeDialog(shell, creator,
                        "select element type");
                if (selectDialog.open() != Dialog.OK) {
                    return;
                }
            }

            T type = list.newElement();
            type.setParent(list);

            SnakeType dialogType = type.getReference() == null ? type : type.getReference();

            // edit new element
            Dialog dialog = SnakeDialogRegistry.createForType(composite.getShell(), dialogType, allowOk, bValidate);
            if (dialog.open() == Dialog.OK) {
                list.add(type);
                refresh();
            } else {
                type.setParent(null);
            }

        } catch (Exception e) {
            SnakeExceptionHandler.handle(e);
        }
    }

    public void refresh() {

        if (tableViewer != null) {
            tableViewer.setInput(list);
            tableViewer.refresh();
        } else if (elements != null) {
            elements.setInput(list);
            elements.refresh();
        }

    }

    @Override
    public void update(ISnakeModification iModification) {

        refresh();
    }

    private void selectOption(SelectionChangedEvent event) {

        if (!(list instanceof SnakeOption)) {
            return;
        }

        SnakeOption options = (SnakeOption) list;

        ISelection selection = event.getSelection();
        if (selection instanceof IStructuredSelection) {
            IStructuredSelection structuredSelection = (IStructuredSelection) selection;
            Object selected = structuredSelection.getFirstElement();
            if (selected instanceof SnakeType) {
                SnakeType selectedChild = (SnakeType) selected;
                options.clearSelection();
                options.setSelected(selectedChild);
            }
        }
    }

}