org.d3s.alricg.editor.common.widgets.DropTable.java Source code

Java tutorial

Introduction

Here is the source code for org.d3s.alricg.editor.common.widgets.DropTable.java

Source

/*
 * Created 23.08.2007
 *
 * This file is part of the project Alricg. The file is copyright
 * protected and under the GNU General Public License.
 * For more information see "http://www.alricg.de/".
 */
package org.d3s.alricg.editor.common.widgets;

import java.util.ArrayList;

import org.d3s.alricg.common.icons.ControlIconsLibrary;
import org.d3s.alricg.editor.common.CustomColumnLabelProvider;
import org.d3s.alricg.editor.common.CustomColumnLabelProvider.ImageProvider;
import org.d3s.alricg.editor.common.CustomColumnLabelProvider.ImageProviderRegulator;
import org.d3s.alricg.editor.common.ViewUtils.CharElementDragSourceListener;
import org.d3s.alricg.editor.common.ViewUtils.TableObject;
import org.d3s.alricg.editor.common.ViewUtils.TableViewContentProvider;
import org.d3s.alricg.editor.common.ViewUtils.TreeOrTableObject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
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.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPartSite;

/**
 * Erstellt eine List mit der Mglichkeit:
 *    - 
 * @author Vincent
 */
public class DropTable extends Composite {
    protected final DropListRegulator regulator;
    protected final int NUMBER_OF_LINES = 5;
    protected final IWorkbenchPartSite site;
    protected TableViewer tableViewer;

    private final Image imgDelete = ControlIconsLibrary.delete.getImageDescriptor().createImage();
    private final Image imgUp = ControlIconsLibrary.arrowUp.getImageDescriptor().createImage();
    private final Image imgDown = ControlIconsLibrary.arrowDown.getImageDescriptor().createImage();

    protected Action deleteElement;
    protected Action upElement;
    protected Action downElement;

    /**
     * Interface um die DropList zu steuern
     * @author Vincent
     */
    public static interface DropListRegulator {

        /**
         * @param obj Object von der "Drop" Opteration
         * @return true - "obj" kann zu der Liste hinzugefgt werden, ansonsten false
         */
        public boolean canDrop(Object obj);

        public ImageProviderRegulator getImageProviderRegulator();
    }

    /**
     * Konstruktor
     * @param parent SWT Parent
     * @param style SWT Style
     * @param regulator Regulator zum Steuern dieser DropList
     */
    public DropTable(Composite parent, int style, DropListRegulator regulator, IWorkbenchPartSite site) {
        super(parent, style);
        this.regulator = regulator;
        this.site = site;

        if (regulator.getImageProviderRegulator() != null) {
            regulator.getImageProviderRegulator().getIconsLibrary()
                    .addConsumer(regulator.getImageProviderRegulator().getConsumer());
        }

        createWidget(parent);

        makeActions();
        hookContextMenu();
    }

    protected Table createTable(Composite parent) {
        // init Table
        tableViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
        tableViewer.getTable().setLinesVisible(false);
        tableViewer.getTable().setHeaderVisible(false);
        ColumnViewerToolTipSupport.enableFor(tableViewer, ToolTip.NO_RECREATE);

        // Drag and Drop
        tableViewer.addDragSupport(DND.DROP_COPY | DND.DROP_MOVE,
                new Transfer[] { LocalSelectionTransfer.getTransfer() },
                new CharElementDragSourceListener(tableViewer));

        TableViewerColumn tc;
        int colIdx = 0;

        // Columns setzen
        if (regulator.getImageProviderRegulator() != null) {
            tc = new TableViewerColumn(tableViewer, SWT.LEFT, colIdx++);
            tc.getColumn().setToolTipText("Symbol");
            tc.setLabelProvider(new ImageProvider(0, regulator.getImageProviderRegulator()));
            tc.getColumn().setWidth(24);
            tc.getColumn().setMoveable(true);
        }

        tc = new TableViewerColumn(tableViewer, SWT.LEFT, colIdx);
        tc.setLabelProvider(new CustomColumnLabelProvider.NameLabelProvider());
        tc.getColumn().setWidth(150);
        tc.getColumn().setMoveable(true);

        // Inhalt setzen
        tableViewer.setContentProvider(new TableViewContentProvider());
        tableViewer.setInput(new ArrayList());

        // Drop untersttzung
        ViewerDropAdapter viewerDrop = new ViewerDropAdapter(tableViewer) {
            @Override
            public void drop(DropTargetEvent event) {

                if (!performDrop(event.data)) {
                    event.feedback = DND.ERROR_INVALID_DATA;
                    event.detail = DND.DROP_NONE;
                    return;
                }
                final TreeOrTableObject source = (TreeOrTableObject) ((StructuredSelection) event.data)
                        .getFirstElement();

                // Prfen ob doppelt
                for (int i = 0; i < tableViewer.getTable().getItemCount(); i++) {
                    if (((TableObject) tableViewer.getElementAt(i)).getValue().equals(source.getValue())) {
                        return; // schon vorhanden!
                    }
                }

                final TableObject tablObj = new TableObject(source.getValue());
                tableViewer.add(tablObj);
            }

            @Override
            public boolean performDrop(Object data) {
                return regulator
                        .canDrop(((TreeOrTableObject) ((StructuredSelection) data).getFirstElement()).getValue());
            }

            @Override
            public boolean validateDrop(Object target, int operation, TransferData transferType) {
                return true;
            }
        };

        // Untersttzung fr DROP
        int ops = DND.DROP_COPY | DND.DROP_MOVE;
        Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer() };
        tableViewer.addDropSupport(ops, transfers, viewerDrop);

        return tableViewer.getTable();
    }

    private void createWidget(Composite parent) {
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        gridLayout.verticalSpacing = 0;
        gridLayout.marginHeight = 10;
        gridLayout.marginWidth = 0;

        GridData tmpGData = new GridData(GridData.GRAB_HORIZONTAL);
        tmpGData.widthHint = 250;
        this.setLayout(gridLayout);
        this.setLayoutData(tmpGData);

        final Table table = createTable(this);
        tmpGData = new GridData(GridData.FILL_BOTH);
        tmpGData.heightHint = table.getItemHeight() * NUMBER_OF_LINES;
        tmpGData.verticalAlignment = GridData.BEGINNING;
        table.setLayoutData(tmpGData);
        table.setToolTipText("Fgen sie Elemente per \"Drag and Drop\" hinzu.");

        final Composite compButtons = new Composite(this, SWT.NONE);
        gridLayout = new GridLayout();
        gridLayout.verticalSpacing = 1;
        gridLayout.marginHeight = 0;
        gridLayout.marginWidth = 0;
        tmpGData = new GridData();
        tmpGData.verticalAlignment = GridData.BEGINNING;
        compButtons.setLayout(gridLayout);
        compButtons.setLayoutData(tmpGData);

        final Button butDelete = new Button(compButtons, SWT.NONE);
        tmpGData = new GridData(imgDelete.getImageData().width + 4, imgDelete.getImageData().height + 4);
        tmpGData.verticalAlignment = GridData.BEGINNING;
        butDelete.setLayoutData(tmpGData);
        butDelete.setImage(imgDelete);
        butDelete.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                deleteElement.run();
            }
        });

        final Button butUp = new Button(compButtons, SWT.NONE);
        butUp.setImage(imgUp);
        tmpGData = new GridData(imgUp.getImageData().width + 4, imgUp.getImageData().height + 4);
        tmpGData.verticalAlignment = GridData.BEGINNING;
        tmpGData.verticalIndent = 5;
        butUp.setLayoutData(tmpGData);
        butUp.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                upElement.run();
            }
        });

        final Button butDown = new Button(compButtons, SWT.NONE);
        butDown.setImage(imgDown);
        butDown.setLayoutData(new GridData(imgDown.getImageData().width + 4, imgDown.getImageData().height + 4));
        butDown.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                downElement.run();
            }
        });
    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.widgets.Widget#dispose()
     */
    @Override
    public void dispose() {
        if (regulator.getImageProviderRegulator() != null) {
            regulator.getImageProviderRegulator().getIconsLibrary()
                    .removeConsumer(regulator.getImageProviderRegulator().getConsumer());
        }
        imgDelete.dispose();
        imgDown.dispose();
        imgUp.dispose();
        super.dispose();
    }

    /**
     * @return Eine Liste von Werte welche in der List gespeichert sind.
     *    Die Liste darf bearbeitet werden, da sie Kopiert wird.
     */
    public java.util.List getValueList() {
        java.util.List list = new ArrayList();

        for (int i = 0; i < tableViewer.getTable().getItemCount(); i++) {
            list.add(((TableObject) tableViewer.getElementAt(i)).getValue());
        }

        return list;
    }

    /**
     * Fgt einen Wert an das Ende der Liste hinzu
     * @param text Der Text fr die List
     * @param value Der Wert fr die ValueList
     */
    public void addValue(Object value) {
        this.tableViewer.add(new TableObject(value));
    }

    protected void makeActions() {

        deleteElement = new Action() {
            @Override
            public void run() {
                tableViewer.getTable().remove(tableViewer.getTable().getSelectionIndices());
            }
        };
        deleteElement.setText("Element entfernen");
        deleteElement.setImageDescriptor(ControlIconsLibrary.delete.getImageDescriptor());

        upElement = new Action() {
            @Override
            public void run() {
                final Table table = tableViewer.getTable();

                // Prfung
                if (table.getSelection().length == 0 || tableViewer.getTable().isSelected(0)) {
                    return;
                }

                // Tauschen
                for (int i = 0; i < table.getSelectionIndices().length; i++) {
                    int selectedIdx = table.getSelectionIndices()[i];
                    final Object selectedObject = tableViewer.getElementAt(selectedIdx);

                    // View
                    tableViewer.replace(tableViewer.getElementAt(selectedIdx - 1), selectedIdx);
                    tableViewer.replace(selectedObject, selectedIdx - 1);
                }

                // Selektion neu setzen
                int[] newSelIdx = new int[table.getSelectionIndices().length];
                for (int i = 0; i < table.getSelectionIndices().length; i++) {
                    newSelIdx[i] = table.getSelectionIndices()[i] - 1;
                }
                table.setSelection(newSelIdx);
            }
        };
        upElement.setText("Element nach oben");
        upElement.setImageDescriptor(ControlIconsLibrary.arrowUp.getImageDescriptor());

        downElement = new Action() {
            @Override
            public void run() {
                final Table table = tableViewer.getTable();

                // Prfung
                if (table.getSelection().length == 0
                        || tableViewer.getTable().isSelected(table.getItemCount() - 1)) {
                    return;
                }

                // Tauschen
                for (int i = table.getSelectionIndices().length - 1; i >= 0; i--) {
                    int selectedIdx = table.getSelectionIndices()[i];
                    final Object selectedObject = tableViewer.getElementAt(selectedIdx);

                    // View
                    tableViewer.replace(tableViewer.getElementAt(selectedIdx + 1), selectedIdx);
                    tableViewer.replace(selectedObject, selectedIdx + 1);
                }

                // Selektion neu setzen
                int[] newSelIdx = new int[table.getSelectionIndices().length];
                for (int i = 0; i < table.getSelectionIndices().length; i++) {
                    newSelIdx[i] = table.getSelectionIndices()[i] + 1;
                }
                table.setSelection(newSelIdx);
            }
        };
        downElement.setText("Element nach unten");
        downElement.setImageDescriptor(ControlIconsLibrary.arrowDown.getImageDescriptor());

    }

    /**
     * Setzt das Context-menu
     */
    protected void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                DropTable.this.fillContextMenu(manager);
            }
        });

        menuMgr.addMenuListener(new IMenuListener() {

            @Override
            public void menuAboutToShow(IMenuManager manager) {
                boolean isEnabled;

                if (tableViewer.getSelection().isEmpty()) {
                    isEnabled = false;
                } else {
                    isEnabled = true;
                }

                for (int i = 0; i < manager.getItems().length; i++) {
                    if (!(manager.getItems()[i] instanceof ActionContributionItem)) {
                        continue;
                    }
                    ActionContributionItem item = (ActionContributionItem) manager.getItems()[i];
                    item.getAction().setEnabled(isEnabled);
                }
            }
        });

        // For Table
        Menu menu = menuMgr.createContextMenu(tableViewer.getControl());
        tableViewer.getControl().setMenu(menu);
        site.registerContextMenu(menuMgr, tableViewer);
    }

    // Das Context Menu beim Rechts-klick
    protected void fillContextMenu(IMenuManager manager) {
        manager.add(this.deleteElement);
        manager.add(new Separator());
        manager.add(this.upElement);
        manager.add(this.downElement);
        /* Um die Warnung
         * Context menu missing standard group 'org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS'
         * im Log zu verhindern */
        manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
    }
}